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
-
// ' 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();
    }
}
Outils personnels
  • Cette page a été consultée 1 673 fois.
donate
Google Ads