SCRIPTED BY Takni Miklos and Edited by Cuteulala Artis
UPDATED UPDATED UPDATED THE PROPER UP TO DATE SCRIPTS FOR THE ROLLER COASTER HAS NOW BEEN FIXED AND ADDED HERE LISTENS ON CHANNEL 12121212 CHANGE IT TO WHAT YOU LIKE IN THE LISTENER SCRIPT! Impotent: Not Authorized for second life import or ANY commercial grid that deals with monetary income! Using this in a commercial grid is illegal and breaking the term and service for free use.
MAIN ENGINE:
// Scripted By Takni Miklos And Edited By Cuteulala Artis Do Not Remove Credits // normal speed is beat 0.1 -- step 2 // ' turbo ' is step 4 -- it derails a lot
float beat = 0.05; // adjusting this below 0.05 (even below0.1) seems to have no effect float step = 2.3 ; // can adjust this up to 4 meters, normal is 2 meters
string track="TrackYellow";//Name of the track it needs to follow
integer REVERSED=128712; integer GEAR = 8363123; integer ALIGN = 1290812; integer START=7979237; integer STOP=711237; integer SETHOME=18271897; integer GOHOME=18271122; integer COME=182723;
vector home; rotation homerot;
lm(integer i, string s, key k) { if(REVERSED==i) { direction*=backward; if(1)state rerailing; } else if(START==i) { stop_after_rerail=0; if(1)state rerailing; } else if(SETHOME==i) { home=llGetPos(); homerot=llGetRot(); } else if(COME==i) { vector p = llList2Vector(llGetObjectDetails(k,[OBJECT_POS]),0); /* if( llList2String(llGetParcelDetails(llGetPos(),[PARCEL_DETAILS_NAME]),0) == llList2String(llGetParcelDetails( p ,[PARCEL_DETAILS_NAME]),0) ) { */ // while(llVecDist(llGetPos(),p)>0.01) // { llSetRegionPos(p); // } // llSetRot( direction*homerot ); llSetLinkPrimitiveParamsFast(LINK_THIS,[PRIM_POSITION,p,PRIM_ROTATION, direction * homerot ]); if(1)state stopped; // } } else if(GOHOME==i) { while(llVecDist(llGetPos(),home)>0.01)llSetPos(home); llSetRot(direction*homerot); if(1)state stopped; } else if(STOP==i) { if(1)state stopped; } else if(ALIGN==i) { stop_after_rerail=1; if(1)state rerailing; } else if(GEAR==i) { float f=(float)s; if(f<0.1)return; if(f>4)return; step = f ; scanradius=6+1.5*step; } }
float scanangle=0.6; // half-angle of the scan cone float scanradius; // 6 more than the minimum distance for target guide (1.5*step) float rerailradius=30; // distance to look for the nearest track.
integer stop_after_rerail;
//d(string s){if(testing)llSay(0,s);}
rotation nextrot; vector nextpos; rotation backward=<0,0,1,0>; rotation forward; rotation direction ;
move() { vector rel=nextpos-llGetPos(); float distance=llVecMag(rel); /* idea here is : pos(t) = pos (0) + vel * t + 1/2 a * t * t ; */ float t = distance / step * beat ; // time needed to get to next track float fraction = step / distance;// same as beat / t rotation g=llGetRot(); vector forward = llRot2Fwd( g ) ; vector pos = llGetPos() + step*forward + ( rel - distance*forward ) *fraction * fraction ; rotation a = g ; a.s = - a.s; // same as a=<0,0,0,1>/llGetRot(); rotation relrot = a * nextrot ; // now llGetRot() * relrot == nextrot float angle = llRot2Angle(relrot) ; vector axis = llRot2Axis(relrot) ; // if(angle>PI){axis*=-1;angle=TWO_PI-angle;} // workaround for osgrid bug: no longer needed llSetLinkPrimitiveParamsFast(LINK_THIS,[ PRIM_POSITION,pos ,PRIM_ROTATION, g * llAxisAngle2Rot(axis,angle*fraction) ]); }
default { state_entry() { home=llGetPos(); llSetText("",<1,1,1>,1); scanradius=6+1.5*step; direction=forward;; string s=llStringTrim(llGetObjectDesc(),STRING_TRIM); if(s)track=s; state stopped; } }
state running { link_message(integer wh, integer i, string s, key k) { lm(i,s,k); } state_entry() { llSensorRepeat(track,"",ACTIVE|PASSIVE, scanradius ,scanangle, beat); } on_rez(integer x) { llResetScript(); } sensor(integer x) { integer i; for(;i<x;++i) { if ( llVecDist( llDetectedPos(i),llGetPos() ) > 1.5*step ) { nextrot=direction*llDetectedRot(i); nextpos=llDetectedPos(i); move(); return; } } llOwnerSay("bad track"); state stopped; }
no_sensor( ){ state stopped;} }
state stopped { link_message(integer wh, integer i, string s, key k){ lm(i,s,k); } state_entry() { stop_after_rerail=0; } on_rez(integer x) {llResetScript(); } }
state rerailing { link_message(integer wh, integer i, string s, key k) { lm(i,s,k); } on_rez(integer x) { llResetScript(); } state_entry(){ llSensor(track,"",ACTIVE|PASSIVE, rerailradius ,PI); }
sensor(integer x) { nextrot=direction*llDetectedRot(0); nextpos=llDetectedPos(0); llSetLinkPrimitiveParamsFast(LINK_THIS,[PRIM_POSITION,nextpos,PRIM_ROTATION,nextrot]); if(llVecDist(llGetPos(),nextpos)<0.01) { if(stop_after_rerail) state stopped; state running; } // d("align didnt get exactly on target - trying to sensor again"); llSensorRepeat(track,"",ACTIVE|PASSIVE, rerailradius ,PI,0.2); } no_sensor( ) { llSensorRemove(); llOwnerSay("No '"+track+"s' nearby. Rez some!"); } }
LISTENER SCRIPT:
integer REVERSED=128712; integer GEAR = 8363123; integer ALIGN = 1290812; integer START=7979237; integer STOP=711237; integer SETHOME=18271897; integer GOHOME=18271122; integer COME=182723;
integer N;
integer running;
default { state_entry() { N=llGetNumberOfPrims(); llListen(1212121212, "", "", ""); }
timer() { llSetTimerEvent(0); llMessageLinked(LINK_THIS, GOHOME, "" ,""); }
listen(integer total_number, string n, key k, string m) { if(llGetOwner()!=llGetOwnerKey(k))return; // if(llGetAgentSize(k)); else return; if("sethome"==m)llMessageLinked(LINK_THIS, SETHOME, "" ,""); else if("come"==m)llMessageLinked(LINK_THIS, COME, "" ,k); else if("start"==m) { running=1; llMessageLinked(LINK_THIS, START, "" ,""); } else if("gohome"==m) { running=0; llMessageLinked(LINK_THIS, GOHOME, "" ,""); } else if("stop"==m) { running=0; llMessageLinked(LINK_THIS, STOP, "" ,""); } else if("align"==m)llMessageLinked(LINK_THIS, ALIGN, "" ,""); else if("reverse"==m)llMessageLinked(LINK_THIS, REVERSED, "" ,""); else if("gear"==llGetSubString(m,0,3)) { llMessageLinked(LINK_THIS, GEAR, llStringTrim(llDeleteSubString(m,0,3),STRING_TRIM) ,""); if(0==running) { running=1; llMessageLinked(LINK_THIS, START, "" ,""); } } else return; llSetTimerEvent(300); } changed(integer what) { if(what & CHANGED_LINK) { if( N < llGetNumberOfPrims() ) // if anyone new sat on us { //llSay(0,"type start / stop"); } N=llGetNumberOfPrims(); } } }
Last edited by Cuteulala Artis on Fri Apr 10, 2015 2:42 pm, edited 5 times in total.
|