vehicle_library.inc 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. // Vehicle Library - Transmission and Speed Detection
  2. // (C) Copyright 2010, Luka P.
  3. #if defined _VEH_LIB_INCLUDED_ALREADY
  4. #endinput
  5. #endif
  6. #define _VEH_LIB_INCLUDED_ALREADY
  7. #pragma library VEH_LIB
  8. #include "a_samp.inc"
  9. // Definitions
  10. #if (!defined USE_MPH && !defined USE_KMPH) || (defined USE_MPH && defined USE_KMPH)
  11. #define USE_KMPH
  12. #endif
  13. #define VEH_STATE_DRIVING_FORWARD (01)
  14. #define VEH_STATE_NOT_DRIVING (00)
  15. #define VEH_STATE_DRIVING_BACKWARDS (-1)
  16. // Enumerator
  17. enum E_VEHICLE_INFO{E_VEHICLE_TRACKING, E_VEHICLE_BACKWARDS, E_VEHICLE_SPEED, E_VEHICLE_TRANS};
  18. new VehicleInfo[MAX_VEHICLES][E_VEHICLE_INFO];
  19. forward UpdateVehicle(vehicleid);
  20. // Callbacks offered by this library:
  21. //
  22. forward OnVehicleTransmissionChange(vehicleid, newtrans, oldtrans);
  23. forward OnVehicleSpeedChange(vehicleid, newspeed, oldspeed);
  24. //
  25. // [!] OnVehicleSpeedChange gets called many times in a second, you can simply compare it to native SA-MP OnPlayerUpdate callback
  26. // [!] You should use it sparely, for most cases when there is a need to get vehicle speed, you can use ReturnVehicleSpeed function
  27. // First function has been done by Joker (you can find it on SA-MP forum, but in more read-able way), and the second one I did. Sorry for 1 line functions, but I like that, and obviously you don't have to change anything here, but if you want, you can contact me to get more read-able version, or even indent it yourself :)
  28. #pragma tabsize 0
  29. stock IsVehicleDrivingBackwards(vehicleid){new Float:Float[3];if(GetVehicleVelocity(vehicleid, Float[1], Float[2], Float[0])){GetVehicleZAngle(vehicleid, Float[0]);if(Float[0] < 90){if(Float[1] > 0 && Float[2] < 0) return true;}else if(Float[0] < 180){if(Float[1] > 0 && Float[2] > 0) return true;}else if(Float[0] < 270){if(Float[1] < 0 && Float[2] > 0) return true;}else if(Float[1] < 0 && Float[2] < 0) return true;}return false;}
  30. stock ReturnVehicleSpeed(vehicleid,type=1){new Float:memory[3]={0.00,0.00,0.00 },result_speed=0;GetVehicleVelocity(vehicleid,memory[0],memory[1],memory[2]);switch(type){case 1:{result_speed=floatround(floatround(floatsqroot(((memory[0]*memory[0])+(memory[1]*memory[1]))+(memory[2]*memory[2]))*(136.666667),floatround_round)*(1.609344));}case 2:{result_speed=floatround(floatsqroot(((memory[0]*memory[0])+(memory[1]*memory[1]))+(memory[2]*memory[2]))*(136.666667),floatround_round);}}return result_speed;}
  31. // You can use above functions to determinate is vehicle driving backwards (obviously, the function name says all)
  32. // and you can use second function to return the vehicle speed, in kilometers or even miles (use type 1 for kmph and type 2 for mph)
  33. public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger){if(!ispassenger){VehicleInfo[vehicleid][E_VEHICLE_TRACKING] = 1;SetTimerEx("UpdateVehicle", 10, 0, "i", vehicleid);}if(funcidx("VEH_LIB_OnPlayerEnterVehicle") != -1){return CallLocalFunction("Streamer_OnPlayerEnterVehicle", "iii", playerid, vehicleid, ispassenger);}return 1;}
  34. public OnPlayerExitVehicle(playerid, vehicleid){if(VehicleInfo[vehicleid][E_VEHICLE_TRACKING]) VehicleInfo[vehicleid][E_VEHICLE_TRACKING] = 0;if(funcidx("VEH_LIB_OnPlayerExitVehicle") != -1){return CallLocalFunction("VEH_LIB_OnGameModeInit", "ii", playerid, vehicleid);}return 1;}
  35. #pragma tabsize 4
  36. public UpdateVehicle(vehicleid)
  37. {
  38. static tmp[2];
  39. tmp[0] = VehicleInfo[vehicleid][E_VEHICLE_SPEED];
  40. tmp[1] = VehicleInfo[vehicleid][E_VEHICLE_TRANS];
  41. #if defined USE_MPH && !defined USE_KMPH
  42. VehicleInfo[vehicleid][E_VEHICLE_SPEED] = ReturnVehicleSpeed(vehicleid, 2);
  43. #elseif !defined USE_MPH && defined USE_KMPH
  44. VehicleInfo[vehicleid][E_VEHICLE_SPEED] = ReturnVehicleSpeed(vehicleid, 1);
  45. #endif
  46. if(tmp[0] != VehicleInfo[vehicleid][E_VEHICLE_SPEED])
  47. CallRemoteFunction("OnVehicleSpeedChange", "iii", vehicleid, VehicleInfo[vehicleid][E_VEHICLE_SPEED], tmp[0]);
  48. if(VehicleInfo[vehicleid][E_VEHICLE_SPEED] != 0)
  49. {
  50. if(!IsVehicleDrivingBackwards(vehicleid))
  51. VehicleInfo[vehicleid][E_VEHICLE_TRANS] = 1;
  52. else
  53. VehicleInfo[vehicleid][E_VEHICLE_TRANS] = -1;
  54. }
  55. else
  56. VehicleInfo[vehicleid][E_VEHICLE_TRANS] = 0;
  57. if(tmp[1] != VehicleInfo[vehicleid][E_VEHICLE_TRANS])
  58. CallRemoteFunction("OnVehicleTransmissionChange", "iii", vehicleid, VehicleInfo[vehicleid][E_VEHICLE_TRANS], tmp[1]);
  59. if(VehicleInfo[vehicleid][E_VEHICLE_TRACKING]) SetTimerEx("UpdateVehicle", 10, 0, "i", vehicleid);
  60. return 1;
  61. }
  62. #if defined _ALS_OnPlayerEnterVehicle
  63. #undef OnPlayerEnterVehicle
  64. #else
  65. #define _ALS_OnPlayerEnterVehicle
  66. #endif
  67. #define OnPlayerEnterVehicle VEH_LIB_OnPlayerEnterVehicle
  68. #if defined _ALS_OnPlayerExitVehicle
  69. #undef OnPlayerExitVehicle
  70. #else
  71. #define _ALS_OnPlayerExitVehicle
  72. #endif
  73. #define OnPlayerExitVehicle VEH_LIB_OnPlayerExitVehicle
  74. forward VEH_LIB_OnPlayerEnterVehicle(playerid, vehicleid, ispassenger);
  75. forward VEH_LIB_OnPlayerExitVehicle(playerid, vehicleid);