Boat

De DigiWiki.

float speed = 0;
integer locked = FALSE;
key agent;
integer handle = 0;
string waterHeight = "";
default
{
    state_entry()
    {
        llSay(0,"Say 'help' to get the notecard");
        speed = 0;
        llListen( 0, "", NULL_KEY, "" ); 
        llSetStatus(STATUS_PHYSICS, FALSE);
        llSetStatus(STATUS_PHANTOM, TRUE);
        llRemoveVehicleFlags(-1);
        llSetVehicleType(VEHICLE_TYPE_NONE);
        llSetStatus(STATUS_PHANTOM, FALSE);
        llSleep(1);
        llSetSitText("Ride");
        llSitTarget(<0.3, 0.0, 0.3>, ZERO_ROTATION);
        llSetCameraEyeOffset(<-5.0, 0.0, 2.0>);
        llSetCameraAtOffset(<3.0, 0.0, 2.0>);
        handle  = llListen( 1431, "", "", "" );
        llSay(1431,"start:1.0:getWater");
    }
 
    on_rez(integer start)
    {
        llResetScript();
    }
 
    listen( integer channel, string name, key id, string message )
    {
        if ( id == llGetOwner() )
        {
            if(message == "reset")
            {
                llSay(0, "Reseting...");
                llResetScript();
            }
            if(message == "help")
            {
                llGiveInventory(id,"Sailboat help");
            }
            if(message == "raise")
            {
                locked = FALSE;
                llSay(0, "The sail is raised.");
            }
            if(message == "anchor")
            {
                locked = TRUE;
                llSay(0, "The anchor is down.");
            }
        }
    }
 
    changed(integer change)
    {
        if (change & CHANGED_LINK)
        {
            agent = llAvatarOnSitTarget();
            if (agent)
            {
                llSetStatus(STATUS_PHYSICS, FALSE);
                llSetStatus(STATUS_PHANTOM, TRUE);
                llRemoveVehicleFlags(-1);
                llSetVehicleType(VEHICLE_TYPE_NONE);
                llSleep(1);
                llSetStatus(STATUS_PHANTOM, FALSE);
                llSetStatus(STATUS_PHYSICS, TRUE);
                llRequestPermissions(agent, PERMISSION_TRIGGER_ANIMATION | PERMISSION_TAKE_CONTROLS);
            }
            else
            {
                llSay(0, "Thanks for using the boat!");
                llSetStatus(STATUS_PHYSICS, FALSE);
                llReleaseControls();
                llStopAnimation("sit");
            }
        }
 
    }
 
    run_time_permissions(integer perm)
    {
        if (perm)
        {
            speed = 0;
            llStartAnimation("sit");
            llSetVehicleType(VEHICLE_TYPE_BOAT);
            llSetVehicleFlags(VEHICLE_FLAG_NO_Z | 
                        VEHICLE_FLAG_NO_DEFLECTION_UP | 
                        VEHICLE_FLAG_HOVER_WATER_ONLY | 
                        VEHICLE_FLAG_LOCK_HOVER_HEIGHT);
			// remove these flags 
			llRemoveVehicleFlags( VEHICLE_FLAG_HOVER_TERRAIN_ONLY 
					    | VEHICLE_FLAG_LIMIT_ROLL_ONLY 
					    | VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT);
			llSetVehicleVectorParam( VEHICLE_RANGE_BLOCK, <1024, 768, 10000> );
			llSetVehicleRotationParam( VEHICLE_ROLL_FRAME, <0.017, 0.017, 0, 0> );
					  // least for forward-back, most friction for up-down
			llSetVehicleVectorParam( VEHICLE_LINEAR_FRICTION_TIMESCALE, <2, 3, 2> );
 
			// uniform angular friction (setting it as a scalar rather than a vector)
			llSetVehicleFloatParam( VEHICLE_ANGULAR_FRICTION_TIMESCALE, 5 );
 
			// linear motor wins after about five seconds, decays after about a minute
 
			llSetVehicleFloatParam( VEHICLE_LINEAR_MOTOR_TIMESCALE, 5 );
			llSetVehicleFloatParam( VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE, 60 );
 
			// agular motor wins after four seconds, decays in same amount of time
 
			llSetVehicleFloatParam( VEHICLE_ANGULAR_MOTOR_TIMESCALE, 7 );
			llSetVehicleFloatParam( VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE, 4 );
 
			llSetVehicleFloatParam( VEHICLE_HOVER_HEIGHT, 1);
 
			llSetVehicleFloatParam( VEHICLE_HOVER_EFFICIENCY,.5 );
			llSetVehicleFloatParam( VEHICLE_HOVER_TIMESCALE, 2.0 );
			llSetVehicleFloatParam( VEHICLE_BUOYANCY, 1 );
 
			// halfway linear deflection with timescale of 3 seconds
			llSetVehicleFloatParam( VEHICLE_LINEAR_DEFLECTION_EFFICIENCY, 0.5 );
			llSetVehicleFloatParam( VEHICLE_LINEAR_DEFLECTION_TIMESCALE, 3 );
 
			// angular deflection 
			llSetVehicleFloatParam( VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY, 0.5 );
			llSetVehicleFloatParam( VEHICLE_ANGULAR_DEFLECTION_TIMESCALE, 5 );
 
			// somewhat bounscy vertical attractor 
			llSetVehicleFloatParam( VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY, 0.5 );
			llSetVehicleFloatParam( VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, 5 );
 
			// weak negative damped banking
			llSetVehicleFloatParam( VEHICLE_BANKING_EFFICIENCY, 3 );
			llSetVehicleFloatParam( VEHICLE_BANKING_MIX, 0.8 );
			llSetVehicleFloatParam( VEHICLE_BANKING_TIMESCALE, .75 );
 
			// default rotation of local frame
			llSetVehicleRotationParam( VEHICLE_REFERENCE_FRAME, <0, 0, 0, 1> );
 
            llTakeControls(CONTROL_FWD | CONTROL_BACK | CONTROL_RIGHT | CONTROL_LEFT | 
                           CONTROL_ROT_RIGHT | CONTROL_ROT_LEFT | CONTROL_UP | 
                           CONTROL_DOWN, TRUE, FALSE);
        }
    }
    control(key id, integer level, integer edge)
    {
        vector angular_motor;
 
        if(level & CONTROL_FWD)
        {
            if(!locked)
            {
            speed += .25;
            llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <speed,0,0>);
            }
        }
        if(level & CONTROL_BACK)
        {
            if(!locked)
            {
            speed -= .25;
            llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <speed,0,0>);
            }
        }
        if(level & (CONTROL_RIGHT|CONTROL_ROT_RIGHT))
        {
            if(!locked)
            {
            angular_motor.x += 2.5;
            angular_motor.z -= 2.5;
            }
        }
        if(level & (CONTROL_LEFT|CONTROL_ROT_LEFT))
        {
            if(!locked)
            {
            angular_motor.x -= 2.5;
            angular_motor.z += 2.5;
            }
        }
 
        if(level & (CONTROL_UP))
        {
            speed = 0;
            llSetVehicleFlags(VEHICLE_FLAG_NO_X | VEHICLE_FLAG_NO_Y);
        }
        if(level & (CONTROL_DOWN))
        {
            speed = 0;
            llRemoveVehicleFlags(VEHICLE_FLAG_NO_X | VEHICLE_FLAG_NO_Y);
        }
 
        llSetVehicleVectorParam(VEHICLE_ANGULAR_MOTOR_DIRECTION, angular_motor);
    }
}
Outils personnels
  • Cette page a été consultée 12 656 fois.
donate
Google Ads