Roller Coaster
De DigiWiki.
(Différences entre les versions)
Ligne 7 : | Ligne 7 : | ||
integer stop_after_rerail; | integer stop_after_rerail; | ||
- | // normal speed is beat 0.1 -- step 2 | + | // 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 beat = 0.05; // adjusting this below 0.05 (even below0.1) seems to have no effect |
Version actuelle en date du 7 mars 2015 à 09:15
// Roller Coaster Engine v0.1 // Scripted By Takni Miklos And Built By Apollosmile AKA Cuteulala Artis Do Not Remove This Credit integer hover = 0; // make these 1 only for testing integer chatty = 0; // thi is =1 to get spam =0 to not get it integer stop_after_rerail; // 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 = "invertedtrack"; //Looks for the track thats 3 Meters Long! and goes the RED AXAA importent integer REVERSED = 128712; integer GEAR = 8363123; integer CENTER = 1290812; integer START = 7979237; integer STOP = 711237; integer SETHOME = 18271897; integer GOHOME = 18271122; integer COME = 182723; vector home; rotation homerot; vector home2; rotation homerot2; vector home3; rotation homerot3; lm (integer i, string s, key k) { if (REVERSED == i) { direction *= backward; if (1) { state rerailing; } } else if (START==i) { if (1) { state rerailing; } } else if(SETHOME == i) { integer w = (integer)s; if (1 == w) { home = llGetPos(); homerot = llGetRot(); } else if (2 == w) { home2 = llGetPos(); homerot2 = llGetRot(); } else { home3 = llGetPos(); homerot3 = 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) { llSetPos(p); } llSetRot(direction*homerot); if (1) { state stopped; } } } else if (GOHOME == i) { integer w = (integer)s; if (1 == w) { llSetRegionPos(home); llSetRot(direction*homerot); } else if (2 == w) { llSetRegionPos(home2); llSetRot(direction*homerot2); } else { llSetRegionPos(home3); llSetRot(direction*homerot3); } if (1) { state stopped; } } else if (STOP == i) { if (1) { state stopped; } } else if (CENTER == i) { stop_after_rerail = 1; if (1) { state rerailing; } } else if(GEAR==i) { float f=(float)s; if(f>=0.1)if(f<=4) { //llOwnerSay("changing gear to "+(string)f); step = f; scanradius = 6 + 1.5*step; } } } // integer channel=0; 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.0; // distance to look for the nearest track. rotation nextrot; vector nextpos; rotation backward = <0.0, 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 Guide float fraction = step / distance;// same as beat / t vector forward = <1,0,0> * llGetRot() ; vector pos = llGetPos() + step*forward + ( rel - distance*forward ) *fraction * fraction; rotation a = llGetRot(); 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;} // comment out this line if not in Aurora opensim llSetLinkPrimitiveParamsFast(LINK_THIS,[ PRIM_POSITION, pos, PRIM_ROTATION, llGetRot()*llAxisAngle2Rot(axis,angle*fraction) ]); } default { state_entry() { home=home2=home3=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() { // llListen(channel,"","","stop"); // llSetColor(<0,1,0>,-1); if(chatty)llSay(0,"running"); if(hover)llSetText(" running -- say stop to stop me ",<1,1,1>,1); 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; if(chatty)llSay(0,"stopped"); if(hover)llSetText("stopped",<1,1,1>,1); } /* touch_end(integer x) { stop_after_rerail=1; state rerailing; } */ 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() { //llSetColor(<1,0,0>,-1); if(chatty)llSay(0,"rerailing"); if(hover)llSetText("trying to rerail",<1,1,1>,1); llSensor(track,"",ACTIVE|PASSIVE, rerailradius ,PI); llSensorRepeat(track,"",ACTIVE|PASSIVE, rerailradius ,PI,0.2); } /* touch_end(integer x) { llSensor(track,"",ACTIVE|PASSIVE, rerailradius ,PI); llSensorRepeat(track,"",ACTIVE|PASSIVE, rerailradius ,PI,0.2); } */ sensor(integer x) { integer i; nextrot=direction*llDetectedRot(i); nextpos=llDetectedPos(i); llSetLinkPrimitiveParamsFast(LINK_THIS,[PRIM_POSITION,nextpos,PRIM_ROTATION,nextrot]); if(llVecDist(llGetPos(),nextpos)<0.01) { if(stop_after_rerail)state stopped; state running; } } no_sensor( ) { if (hover) { llSetText("rerail FALED", <1.0, 1.0, 1.0>, 1.0); } llSensorRemove(); llOwnerSay("No '" + track + "s' nearby. Rez some and click me"); } }
// Roller Coaster Menu v0.1 key user; integer REVERSED = 128712; integer GEAR = 8363123; integer CENTER = 1290812; integer START = 7979237; integer STOP = 711237; integer SETHOME = 18271897; integer GOHOME = 18271122; integer COME = 182723; //integer N; integer running; integer h; integer channel; list ownerbuttons = [ "sethome", "gohome", " ", "sethome2", "gohome2", " ", "sethome3", "gohome3", " ", "start", "stop", "snap" ]; list buttons = ["start","stop","snap"]; launch() { llSetTimerEvent(300); llListenControl(h,1); if (llGetOwner() == user) { llDialog(user," ",ownerbuttons,channel); } else { llDialog(user, " ", buttons, channel); } } default { state_entry() { // N=llGetNumberOfPrims(); channel=0x7fffffff-2*(integer)llFrand(2.1e9)-(integer)llFrand(2.0e5); h=llListen(channel, "", "", ""); llListenControl(h,0); } on_rez(integer x) {llResetScript();} timer() { llSetTimerEvent(0); llListenControl(h,0); llMessageLinked(LINK_THIS, GOHOME, "1" ,""); } listen(integer total_number, string n, key k, string m) { // if(llGetOwner()!=llGetOwnerKey(k))return; // if("sethome" == m) { llMessageLinked(LINK_THIS, SETHOME, "1" ,""); } else if("gohome" == m) { running = 0; llMessageLinked(LINK_THIS, GOHOME, "1" ,""); } else if("sethome2"==m) { llMessageLinked(LINK_THIS, SETHOME, "2" ,""); } else if("gohome2"==m) { running = 0; llMessageLinked(LINK_THIS, GOHOME, "2" ,""); } else if("sethome3"==m) { llMessageLinked(LINK_THIS, SETHOME, "3" ,""); } else if("gohome3"==m) { running=0; llMessageLinked(LINK_THIS, GOHOME, "3" ,""); } else if("come"==m) { llMessageLinked(LINK_THIS, COME, "" ,k); } else if("start"==m) { running = 1; llMessageLinked(LINK_THIS, START, "" ,""); } else if("stop"==m) { running = 0; llMessageLinked(LINK_THIS, STOP, "" ,""); llSleep(0.2); llMessageLinked(LINK_THIS, GOHOME, "1" ,""); } // else if("align"==m)llMessageLinked(LINK_THIS, CENTER, "" ,""); else if ("snap" == m) { llMessageLinked(LINK_THIS, CENTER, "" , ""); } 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); } touch_start(integer x) { user = llDetectedKey(0); launch(); } }