<html><head><style type="text/css"><!-- DIV {margin:0px;} --></style></head><body><div style="font-family:arial,helvetica,sans-serif;font-size:12pt"><div>Jeff Heaton, in his book, "Introduction to Linden Scripting Language for Second Life" has a vehicle script for a basic car on page 171. At the risk of irritating Jeff, I am pasting it here and hoping we can use it for a test script to wring out vehicle script functionality.<br><br>It uses the LSL functions llSetVehicleType(), llSetVehicleFloatParam() & llSetVehicleVectorParam() which are three of the key vehicle functions we need to support.<br><br>I am hoping a few folks might take this script, test it, Mantis the results and help us get momentum to patch the missing pieces.<br><br>Charles<br><br>// Encog's Magic Wagon<br>// Very simple vehicle script<br><br>float forward_power = 15; //Power used to go forward (1 to 30)<br>float reverse_power = -15; //Power ued to go reverse (-1 to -30)<br>float
turning_ratio = 2.0; //How sharply the vehicle turns. Less is more sharply. (.1 to 10)<br>string sit_message = "Ride"; //Sit message<br>string not_owner_message = "You are not the owner of this vehicle ..."; //Not owner message<br><br>setVehicle()<br>{<br> //car<br> <br> llSetVehicleType(VEHICLE_TYPE_CAR);<br> llSetVehicleFloatParam(VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY, 0.2);<br> llSetVehicleFloatParam(VEHICLE_LINEAR_DEFLECTION_EFFICIENCY, 0.80);<br> llSetVehicleFloatParam(VEHICLE_ANGULAR_DEFLECTION_TIMESCALE, 0.10);<br> llSetVehicleFloatParam(VEHICLE_LINEAR_DEFLECTION_TIMESCALE, 0.10);<br> llSetVehicleFloatParam(VEHICLE_LINEAR_MOTOR_TIMESCALE,
1.0);<br> llSetVehicleFloatParam(VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE, 0.1);<br> llSetVehicleFloatParam(VEHICLE_ANGULAR_MOTOR_TIMESCALE, 0.1);<br> llSetVehicleFloatParam(VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE, 0.1);<br> llSetVehicleVectorParam(VEHICLE_LINEAR_FRICTION_TIMESCALE, <10.0, 2.0, 1000.0>);<br> llSetVehicleVectorParam(VEHICLE_ANGULAR_FRICTION_TIMESCALE, <0.1, 0.1, 0.1>);<br> llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY, 0.50);<br> llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, 0.50);<br> <br>}<br><br>default<br>{<br> state_entry()<br>
{<br> llSetSitText(sit_message);<br> // forward-back,left-right,updown<br> llSitTarget(<0.2,0,0.45>, ZERO_ROTATION );<br> <br> llSetCameraEyeOffset(<-8, 0.0, 5.0>);<br> llSetCameraAtOffset(<1.0, 0.0, 2.0>);<br> <br> //llPreloadSound("car_start");<br> //llPreloadSound("car_run");<br> setVehicle();<br> }<br> <br> changed(integer change)<br> {<br> <br>
<br> if (change & CHANGED_LINK)<br> {<br> <br> key agent = llAvatarOnSitTarget();<br> if (agent)<br> { <br> if (agent != llGetOwner())<br> {<br> llSay(0,
not_owner_message);<br> llUnSit(agent);<br> llPushObject(agent, <0,0,50>, ZERO_VECTOR, FALSE);<br> }<br> else<br> {<br> //llTriggerSound("car_start",1);<br>
<br> <br> llMessageLinked(LINK_ALL_CHILDREN , 0, "WHEEL_DRIVING", NULL_KEY);<br> llSleep(.4);<br> llSetStatus(STATUS_PHYSICS, TRUE);<br> setVehicle();<br>
llSleep(.1);<br> llRequestPermissions(agent, PERMISSION_TRIGGER_ANIMATION | PERMISSION_TAKE_CONTROLS);<br><br> //llLoopSound("car_run",1);<br> }<br> }<br> else<br> {<br> //llStopSound();<br>
<br> llSetStatus(STATUS_PHYSICS, FALSE);<br> llSleep(.4);<br> llReleaseControls();<br> llTargetOmega(<0,0,0>,PI,0);<br> <br> llResetScript();<br> }<br> }<br> <br> }<br> <br> run_time_permissions(integer
perm)<br> {<br> if (perm)<br> {<br> llTakeControls(CONTROL_FWD | CONTROL_BACK | CONTROL_DOWN | CONTROL_UP | CONTROL_RIGHT | <br> CONTROL_LEFT | CONTROL_ROT_RIGHT | CONTROL_ROT_LEFT, TRUE, FALSE);<br> }<br> }<br> <br> control(key id, integer level, integer edge)<br> {<br> integer reverse=1;<br> vector angular_motor;<br> <br> //get current
speed<br> vector vel = llGetVel();<br> float speed = llVecMag(vel);<br><br> //car controls<br> if(level & CONTROL_FWD)<br> {<br> llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <forward_power,0,0>);<br> reverse=1;<br> }<br> if(level & CONTROL_BACK)<br> {<br> llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION,
<reverse_power,0,0>);<br> reverse = -1;<br> }<br><br> if(level & (CONTROL_RIGHT|CONTROL_ROT_RIGHT))<br> {<br> angular_motor.z -= speed / turning_ratio * reverse;<br> }<br> <br> if(level & (CONTROL_LEFT|CONTROL_ROT_LEFT))<br> {<br> angular_motor.z += speed / turning_ratio * reverse;<br> }<br><br> llSetVehicleVectorParam(VEHICLE_ANGULAR_MOTOR_DIRECTION,
angular_motor);<br><br> } //end control <br> <br> <br>} //end default<br></div></div></body></html>