Script.lsl 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. // :SHOW:
  2. // :CATEGORY:Boat
  3. // :NAME:OpenSim JetSki
  4. // :AUTHOR:Thomas Ringate
  5. // :KEYWORDS:
  6. // :CREATED:2015-06-11 16:29:24
  7. // :EDITED:2015-06-11 15:29:24
  8. // :ID:1080
  9. // :NUM:1799
  10. // :REV:1
  11. // :WORLD:Opensim
  12. // :DESCRIPTION:
  13. // TSim Jet Ski
  14. // :CODE:
  15. //:License: GPLV2
  16. //:VERSION:1.02
  17. // XEngine:lsl
  18. // TSim Jet Ski V1.02
  19. // Licensed under the GPLv2.
  20. // From the OsGrid Forums:
  21. // http://forums.osgrid.org/viewtopic.php?f=5&t=5486
  22. // Tested as working with the bullet physics engine.
  23. // This script detects the region edge and stops the jet ski from crossing the border. It detects the size of a var region.
  24. // The four arrow keys steer the jet ski.
  25. // The jet ski will detect shore and come to a near stop.
  26. // If you beach the jet ski you are going to have to drive it back in the water. It will move very slowly on land.
  27. // Version V1.02
  28. // Initial release
  29. //
  30. //==== G L O B A L V A R I A B L E D E C L A R A T I O N ====
  31. integer xlimit; // region size limit
  32. integer ylimit; // region size limit
  33. integer gRun; //Engine status
  34. integer gGuard = 3; // the distance to detect the edge of the region boundary
  35. string gDrivingAnim = "motorcycle_sit"; // sit animation for the jet ski
  36. vector gSitTarget_Pos = <-0.43,0.03,0.69>; // sit position (will need to be adjusted for your jet ski)
  37. vector vTarget; // vehicle position
  38. key gAgent; // the key for the siting avatar
  39. float fWaterLevel; //region water level
  40. float gSpeed = 35.0; // forward speed of the jet ski
  41. float gForwardThrust; // variable for forward thrust
  42. float gReverseThrust = -15; // reverse thrust which is it's reverse speed
  43. float gTurnMulti=1.012345; // used for the AngularMotor
  44. float gTurnRatio; // used for the AngularMotor
  45. init_engine(){
  46. gRun = 0; //Engine off
  47. vector gSitTarget_Rot = llRot2Euler( llGetRootRotation() ); // SIT TARGET IS BASED ON VEHICLE'S ROTATION.
  48. llSitTarget(gSitTarget_Pos, llEuler2Rot(DEG_TO_RAD * gSitTarget_Rot));
  49. llSetLinkPrimitiveParamsFast(LINK_ALL_CHILDREN, [PRIM_PHYSICS_SHAPE_TYPE, PRIM_PHYSICS_SHAPE_NONE]);
  50. }
  51. init_followCam(){
  52. llSetCameraParams(
  53. [
  54. CAMERA_ACTIVE, 1, // 0=INACTIVE 1=ACTIVE
  55. CAMERA_BEHINDNESS_ANGLE, 2.5, // (0 to 180) DEGREES
  56. CAMERA_BEHINDNESS_LAG, 0.3, // (0 to 3) SECONDS
  57. CAMERA_DISTANCE, 6.0, // ( 0.5 to 10) METERS
  58. CAMERA_PITCH, 12.0, // (-45 to 80) DEGREES
  59. CAMERA_POSITION_LOCKED, FALSE, // (TRUE or FALSE)
  60. CAMERA_POSITION_LAG, 0.0, // (0 to 3) SECONDS
  61. CAMERA_POSITION_THRESHOLD, 0.0, // (0 to 4) METERS
  62. CAMERA_FOCUS_LOCKED, FALSE, // (TRUE or FALSE)
  63. CAMERA_FOCUS_LAG, 0.0, // (0 to 3) SECONDS
  64. CAMERA_FOCUS_THRESHOLD, 0.0, // (0 to 4) METERS
  65. CAMERA_FOCUS_OFFSET, <0.0,0,0> // <-10,-10,-10> to <10,10,10> METERS
  66. ]);
  67. llForceMouselook(FALSE); // make sure mouse look is off
  68. }
  69. set_engine(){
  70. llSetVehicleType(VEHICLE_TYPE_BOAT);
  71. // default rotation of local frame
  72. llSetVehicleRotationParam(VEHICLE_REFERENCE_FRAME, <0.00000, 0.00000, 0.00000, 0.00000>); // <0.00000, 0.00000, 0.00000, 0.00000>
  73. // linear motor wins after about five seconds, decays after about a minute
  74. llSetVehicleFloatParam(VEHICLE_LINEAR_MOTOR_TIMESCALE, 0.90);
  75. llSetVehicleFloatParam(VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE, 0.10);
  76. // least for forward-back, most friction for up-down
  77. llSetVehicleVectorParam(VEHICLE_LINEAR_FRICTION_TIMESCALE, <1.0,1.0,1.0> );
  78. // uniform angular friction (setting it as a scalar rather than a vector)
  79. llSetVehicleVectorParam(VEHICLE_ANGULAR_FRICTION_TIMESCALE, <1.0,1000.0,1000.0> );
  80. // agular motor wins after four seconds, decays in same amount of time
  81. llSetVehicleFloatParam(VEHICLE_ANGULAR_MOTOR_TIMESCALE, 0.20);
  82. llSetVehicleFloatParam(VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE, 0.10);
  83. // halfway linear deflection with timescale of 3 seconds
  84. llSetVehicleFloatParam(VEHICLE_LINEAR_DEFLECTION_EFFICIENCY, 0.10);
  85. llSetVehicleFloatParam(VEHICLE_LINEAR_DEFLECTION_TIMESCALE, 10.00);
  86. // angular deflection
  87. llSetVehicleFloatParam(VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY, 0.10);
  88. llSetVehicleFloatParam(VEHICLE_ANGULAR_DEFLECTION_TIMESCALE, 10.00);
  89. // somewhat bounscy vertical attractor
  90. llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY, 0.5);
  91. llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, 2.00);
  92. // hover
  93. llSetVehicleFloatParam(VEHICLE_HOVER_HEIGHT, 0.1 );
  94. llSetVehicleFloatParam(VEHICLE_HOVER_EFFICIENCY, 0.5 );
  95. llSetVehicleFloatParam(VEHICLE_HOVER_TIMESCALE, 50.0 );
  96. llSetVehicleFloatParam(VEHICLE_BUOYANCY, 1.0 );
  97. // weak negative damped banking
  98. llSetVehicleFloatParam( VEHICLE_BANKING_EFFICIENCY, 1.0 );
  99. llSetVehicleFloatParam( VEHICLE_BANKING_MIX, 1.0 );
  100. llSetVehicleFloatParam( VEHICLE_BANKING_TIMESCALE, 0.5 );
  101. // remove these flags
  102. llRemoveVehicleFlags( VEHICLE_FLAG_HOVER_TERRAIN_ONLY
  103. | VEHICLE_FLAG_LIMIT_ROLL_ONLY
  104. | VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT);
  105. // set these flags
  106. llSetVehicleFlags( VEHICLE_FLAG_NO_DEFLECTION_UP
  107. | VEHICLE_FLAG_HOVER_WATER_ONLY
  108. | VEHICLE_FLAG_HOVER_UP_ONLY
  109. | VEHICLE_FLAG_LIMIT_MOTOR_UP );
  110. }
  111. default {
  112. state_entry()
  113. {
  114. vector vTarget = llGetPos();
  115. vTarget.z = llGround( ZERO_VECTOR );
  116. fWaterLevel = llWater( ZERO_VECTOR );
  117. if( vTarget.z < fWaterLevel )
  118. {
  119. vTarget.z = fWaterLevel;
  120. llSay(0,"Ready to go!");
  121. }
  122. else
  123. {
  124. llSay(0,"I work best in water!");
  125. }
  126. llSetRegionPos(vTarget + <0,0,0.1>);
  127. init_engine(); // initialize the engine
  128. state Running; // switch to the running state
  129. }
  130. }
  131. state Running{
  132. state_entry(){
  133. }
  134. on_rez(integer param) {
  135. llResetScript();
  136. }
  137. changed(integer change){
  138. if ((change & CHANGED_LINK) == CHANGED_LINK){
  139. gAgent = llAvatarOnSitTarget(); // get the sitting avatars key
  140. if (gAgent != NULL_KEY){ // we have a driver
  141. llSetStatus(STATUS_PHYSICS, TRUE);
  142. llSetStatus(STATUS_ROTATE_Y,TRUE);
  143. llSetStatus(STATUS_ROTATE_Z,TRUE);
  144. set_engine(); // set the engine parameters
  145. vector regionsize = osGetRegionSize(); // get the max size of the region dimentions
  146. xlimit = (integer)regionsize.x - gGuard; // set the region top limit
  147. ylimit = (integer)regionsize.y - gGuard; // set the region top limit
  148. llRequestPermissions(gAgent, PERMISSION_TRIGGER_ANIMATION | PERMISSION_TAKE_CONTROLS | PERMISSION_CONTROL_CAMERA | PERMISSION_TRACK_CAMERA);
  149. gRun = 1; // Engine on
  150. }
  151. else { // driver got off
  152. llSetStatus(STATUS_PHYSICS, FALSE); // turn physics off
  153. gRun = 0; // Engine off
  154. init_engine(); // initialize the engine
  155. llStopAnimation(gDrivingAnim);
  156. llPushObject(gAgent, <3,3,21>, ZERO_VECTOR, FALSE);
  157. llReleaseControls();
  158. llClearCameraParams();
  159. llSetCameraParams([CAMERA_ACTIVE, 0]);
  160. llSetText("",<0,0,0>,1.0);
  161. }
  162. }
  163. }
  164. run_time_permissions(integer perm){
  165. if (perm) {
  166. llTakeControls(CONTROL_FWD | CONTROL_BACK | CONTROL_ROT_RIGHT | CONTROL_ROT_LEFT, TRUE, FALSE);
  167. init_followCam();
  168. llStartAnimation(gDrivingAnim);
  169. llSleep(1.5);
  170. }
  171. }
  172. control(key id, integer held, integer change){
  173. if(gRun == 0){
  174. return;
  175. }
  176. integer reverse=1;
  177. vector vel = llGetVel();
  178. vector speedvec = llGetVel() / llGetRot();
  179. vector AngularMotor;
  180. gTurnRatio = 1.5;
  181. vTarget = llGetPos(); // get jet ski position
  182. if (held & CONTROL_FWD){
  183. reverse=1;
  184. gForwardThrust = gSpeed;
  185. // if near region edge, slow down, and veer to the right
  186. if (vTarget.x > xlimit || vTarget.x < gGuard || vTarget.y > ylimit || vTarget.y < gGuard) {
  187. llSetVehicleVectorParam(VEHICLE_LINEAR_FRICTION_TIMESCALE, <1.0, 2.0, 8.0>);
  188. gForwardThrust = 3; // slow us down
  189. if (vTarget.x > xlimit) vTarget.x = xlimit;
  190. if (vTarget.x < gGuard) vTarget.x = gGuard;
  191. if (vTarget.y > xlimit) vTarget.y = ylimit;
  192. if (vTarget.y < gGuard) vTarget.y = gGuard;
  193. reverse = -1;
  194. llWhisper(0, "Approaching sim edge, turn away...");
  195. }
  196. if (vTarget.z > (fWaterLevel + 1.4)) {
  197. gForwardThrust = 2; // slow us down
  198. }
  199. llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <gForwardThrust,0,0>);
  200. llSetPos(vTarget);
  201. }
  202. if (held & CONTROL_BACK){
  203. llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <gReverseThrust,0,0>);
  204. gTurnRatio = -2.0;
  205. reverse = -1;
  206. }
  207. // vector AngularMotor;
  208. AngularMotor.y = 0;
  209. if (held & (CONTROL_ROT_RIGHT)){
  210. AngularMotor.x += ((gTurnRatio/gTurnMulti)*1);
  211. AngularMotor.z -= ((gTurnRatio*gTurnMulti)/1);
  212. }
  213. if (held & (CONTROL_ROT_LEFT)){
  214. AngularMotor.x -= ((gTurnRatio/gTurnMulti)*1);
  215. AngularMotor.z += ((gTurnRatio*gTurnMulti)/1);
  216. }
  217. llSetVehicleVectorParam(VEHICLE_ANGULAR_MOTOR_DIRECTION, AngularMotor);
  218. }
  219. }