controller.lsl 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. // :CATEGORY:Helicopter
  2. // :NAME:Helicopter scripts
  3. // :AUTHOR:Anonymous
  4. // :CREATED:2013-09-06
  5. // :EDITED:2013-09-18 15:38:54
  6. // :ID:377
  7. // :NUM:521
  8. // :REV:1
  9. // :WORLD:Second Life
  10. // :DESCRIPTION:
  11. // controller
  12. // :CODE:
  13. ////////////////////////////////////////////////////////////////
  14. integer HUD = 87654567; // the secret channel the HUD is own
  15. float ROTATION_RATE = 1.0; // Rate of turning
  16. float FWD_THRUST = 25; // Forward thrust motor force
  17. float BACK_THRUST = 25; // Backup thrust
  18. float VERTICAL_THRUST = 15;
  19. vector linear_motor = <0,0,0>; // Keep a running linear motor value for better response
  20. default {
  21. // this runs first after a reset
  22. state_entry() {
  23. llListen(HUD,"","",""); // listen for HUD commands
  24. llListen(0,"",llGetOwner(),""); // listen for owner on channel 0
  25. llSitTarget(<0.1, 0.0, 1.95>, ZERO_ROTATION);
  26. llSetVehicleType(VEHICLE_TYPE_AIRPLANE);
  27. llSetVehicleFloatParam(VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY, 0.5);
  28. llSetVehicleFloatParam(VEHICLE_LINEAR_DEFLECTION_EFFICIENCY, 0.5);
  29. llSetVehicleFloatParam(VEHICLE_ANGULAR_DEFLECTION_TIMESCALE, 100);
  30. llSetVehicleFloatParam(VEHICLE_LINEAR_DEFLECTION_TIMESCALE, 100);
  31. llSetVehicleFloatParam(VEHICLE_LINEAR_MOTOR_TIMESCALE, 0.2);
  32. llSetVehicleFloatParam(VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE, 10);
  33. llSetVehicleFloatParam(VEHICLE_ANGULAR_MOTOR_TIMESCALE, 0.2);
  34. llSetVehicleFloatParam(VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE, 0.1);
  35. llSetVehicleVectorParam(VEHICLE_LINEAR_FRICTION_TIMESCALE, <5,5,5>);
  36. llSetVehicleVectorParam(VEHICLE_ANGULAR_FRICTION_TIMESCALE, <10,10,10>);
  37. llSetVehicleFloatParam(VEHICLE_HOVER_HEIGHT, 0.0);
  38. llSetVehicleFloatParam(VEHICLE_HOVER_EFFICIENCY, 0.0);
  39. llSetVehicleFloatParam(VEHICLE_HOVER_TIMESCALE, 1.0);
  40. llSetVehicleFloatParam(VEHICLE_BUOYANCY, 1.0);
  41. llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY, 0.2);
  42. llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, 3.0);
  43. llSetVehicleFloatParam(VEHICLE_BANKING_EFFICIENCY, 1.0);
  44. llSetVehicleFloatParam(VEHICLE_BANKING_MIX, 0.75);
  45. llSetVehicleFloatParam(VEHICLE_BANKING_TIMESCALE, 0.05);
  46. llSetCameraEyeOffset(<-7.0, 0.0, 3.0>);
  47. llSetSitText("RAH-66");
  48. llSetCameraAtOffset(<0.5, 0, 0>);
  49. }
  50. changed(integer change) {
  51. if (change & CHANGED_LINK) {
  52. key agent = llAvatarOnSitTarget();
  53. if (agent) {
  54. if (agent != llGetOwner()) {
  55. // only the owner can use this vehicle
  56. llSay(0, "You aren't the owner of this Comanche.");
  57. llUnSit(agent);
  58. llPushObject(agent, <0,0,10>, ZERO_VECTOR, FALSE);
  59. } else {
  60. // driver is entering the vehicle
  61. llOwnerSay("type 'start' to begin fying");
  62. // llRequestPermissions(agent, PERMISSION_TRIGGER_ANIMATION | PERMISSION_TAKE_CONTROLS);
  63. }
  64. } else {
  65. // driver is getting up
  66. llSetStatus(STATUS_PHYSICS, FALSE);
  67. llReleaseControls();
  68. }
  69. }
  70. }
  71. listen(integer channel, string name, key id, string message)
  72. {
  73. if(llToLower(message) == "start") {
  74. // owner or HUD spoke 'STart' or START or start
  75. llMessageLinked(LINK_SET,0,"start",""); // send to any other scripts
  76. llRequestPermissions(llGetOwner(), PERMISSION_TAKE_CONTROLS);
  77. } else if (llToLower(message) == "stop") {
  78. llMessageLinked(LINK_SET,0,"stop",""); // send 'stop' to any other scripts
  79. llSetStatus(STATUS_PHYSICS, FALSE);
  80. llReleaseControls();
  81. }
  82. }
  83. run_time_permissions(integer perm) {
  84. if (perm & PERMISSION_TAKE_CONTROLS) {
  85. llSetStatus(STATUS_PHYSICS, TRUE);
  86. llTakeControls(CONTROL_FWD | CONTROL_BACK | CONTROL_RIGHT | CONTROL_LEFT | CONTROL_ROT_RIGHT | CONTROL_ROT_LEFT | CONTROL_UP | CONTROL_DOWN, TRUE, FALSE);
  87. }
  88. }
  89. link_message(integer sender_number, integer number, string message, key id)
  90. {
  91. // incoming link messages appar here, so you can control this script from other scripts.
  92. }
  93. control(key id, integer level, integer edge) {
  94. if(level & (CONTROL_LEFT | CONTROL_ROT_LEFT)) {
  95. llSetVehicleVectorParam(VEHICLE_ANGULAR_MOTOR_DIRECTION, <-ROTATION_RATE,0,0>);
  96. } else if (edge & (CONTROL_LEFT | CONTROL_ROT_LEFT)) {
  97. llSetVehicleVectorParam(VEHICLE_ANGULAR_MOTOR_DIRECTION, <0,0,0>);
  98. }
  99. if(level & (CONTROL_RIGHT | CONTROL_ROT_RIGHT)) {
  100. llSetVehicleVectorParam(VEHICLE_ANGULAR_MOTOR_DIRECTION, <ROTATION_RATE,0,0>);
  101. } else if (edge & (CONTROL_RIGHT | CONTROL_ROT_RIGHT)) {
  102. llSetVehicleVectorParam(VEHICLE_ANGULAR_MOTOR_DIRECTION, <0,0,0>);
  103. }
  104. if(level & CONTROL_FWD) {
  105. linear_motor.x = FWD_THRUST;
  106. } else if (edge & CONTROL_FWD) {
  107. linear_motor.x = 0;
  108. }
  109. if(level & CONTROL_BACK) {
  110. linear_motor.x = -BACK_THRUST;
  111. } else if (edge & CONTROL_BACK) {
  112. linear_motor.x = 0;
  113. }
  114. if(level & CONTROL_UP) {
  115. linear_motor.z = VERTICAL_THRUST;
  116. } else if (edge & CONTROL_UP) {
  117. linear_motor.z = 0;
  118. }
  119. if(level & CONTROL_DOWN) {
  120. linear_motor.z = -VERTICAL_THRUST;
  121. } else if (edge & CONTROL_DOWN) {
  122. linear_motor.z = 0;
  123. }
  124. llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, linear_motor);
  125. }
  126. }