Guest User

wheelie.pwn

a guest
May 2nd, 2015
686
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.46 KB | None | 0 0
  1. /*
  2. * SA-MP Wheelie filterscript made by Gesior7
  3. *
  4. */
  5.  
  6. #include a_samp
  7.  
  8. #include PlayerConnect
  9.  
  10. #define SPEED_SAMPLES 5
  11. #define WHEELIE_SAMPLES 5
  12. #define ACCELERATION_SENSITIVITY 0.005
  13.  
  14. #assert SPEED_SAMPLES > 0
  15.  
  16.  
  17.  
  18. #define ceildiv(%1,%2) (((%1) + (%2) - 1) / (%2)) // Taken from YSI_misc.own.
  19. #define abs(%1) (((%1)<0)?(-(%1)):(%1))
  20. #define sign(%1) (((%1)<0)?(-1):(1))
  21.  
  22. //#define forAll(%1) for(%1=PlayerIDs[MAX_PLAYERS]; %1!=-1; %1=PlayerIDs[%1])
  23.  
  24.  
  25.  
  26. //new PlayerIDs[MAX_PLAYERS+1]={-1,...};
  27.  
  28. new WheelieTimer;
  29. //new PlayerTickCount[MAX_PLAYERS] = {0,...};
  30. new Float: Wheelie[MAX_PLAYERS][WHEELIE_SAMPLES+1];
  31. new Float: Drift[MAX_PLAYERS];
  32. new Float: PlayerSpeed[MAX_PLAYERS][SPEED_SAMPLES+1];
  33. new WheelieAllow[ceildiv(MAX_PLAYERS,32)] = {0,...};
  34.  
  35. static const ForbiddenVehicles[] =
  36. {
  37. 417, 425, 430, 435, 446, 447, 448, 449, 450, 452, 453, 454, 460, 461, 462, 463, 464, 465, 468, 469, 471, 472, 473, 476, 481, 484, 487, 488, 493, 497,
  38. 501, 509, 510, 511, 512, 513, 519, 520, 521, 522, 523, 537, 538, 548, 553, 563, 569, 570, 577, 581, 584, 586, 590, 591, 592, 593, 595,
  39. 606, 607, 608, 610, 611
  40. };
  41.  
  42.  
  43. public OnFilterScriptInit()
  44. {
  45. new playerstate;
  46. for(new i = 0, j = GetMaxPlayers(); i < j; i++){
  47. if(!IsPlayerConnected(i)) continue;
  48. //OnPlayerConnect(i);
  49. playerstate = GetPlayerState(i);
  50. OnPlayerStateChange(i, playerstate, playerstate);
  51. }
  52.  
  53. WheelieTimer = SetTimer("Car",50,1);
  54. return 1;
  55. }
  56.  
  57. public OnFilterScriptExit()
  58. {
  59. KillTimer(WheelieTimer);
  60. return 1;
  61. }
  62.  
  63. forward Car();
  64. public Car()
  65. {
  66. new playerid;
  67.  
  68. for(Players;playerid)
  69. {
  70. if(!(WheelieAllow[playerid/32] & (1<<(playerid%32)))) continue;
  71.  
  72. new vehicleid = GetPlayerVehicleID(playerid);
  73.  
  74. if(!vehicleid) continue;
  75.  
  76. new Float:w,Float:x,Float:y,Float:z;
  77. new Float:v,Float:a,Float:matrix[9];
  78. new Float:vx,Float:vy,Float:vz;
  79. new keys,updown,leftright;
  80. new Float:matrix_conj[9];
  81. new //Float: drift = 0.0,
  82. Float: wheelie = 0.0,
  83. Float: wheelie_speed,
  84. Float: angle_speed;
  85.  
  86. GetPlayerKeys(playerid,keys,updown,leftright);
  87. GetVehicleVelocity(vehicleid,vx,vy,vz);
  88. GetVehicleZAngle(vehicleid,a);
  89.  
  90. angle_speed = a - Drift[playerid];
  91. Drift[playerid] = a;
  92. if( 180.0 <= angle_speed ) angle_speed -= 360.0;
  93. else
  94. if( angle_speed <= -180.0 ) angle_speed += 360.0;
  95.  
  96. v = vy*floatcos(a,degrees) - vx*floatsin(a,degrees);
  97. //v = floatsqroot(vx*vx+vy*vy/*+vz*vz*/);
  98.  
  99. a = Diff(v,PlayerSpeed[playerid],SPEED_SAMPLES+1);
  100.  
  101. GetVehicleRotationQuat(vehicleid,w,x,y,z);
  102. Quat2Matrix33(w,x,z,y, matrix);
  103. Quat2Matrix33(w,-x,-z,-y, matrix_conj);
  104.  
  105. RotateVector(vx,vz,vy, matrix_conj);
  106. new Float: tmp;
  107. //new str[128];
  108.  
  109. tmp = vx*vx + vy*vy;
  110. // if( tmp > 0.005 ) drift = -asin( vx / floatsqroot(tmp) );
  111.  
  112. if( (Float:(_:vz & 0x7FFFFFFF) > 0.2) && tmp > 0.005 ) {
  113. tmp = vz / floatsqroot(tmp);
  114. new str[32];
  115. format(str, 32, "~n~~n~~n~~n~%s", ((tmp > 0.5)?("~w~"):("~r~")), tmp);
  116. GameTextForPlayer(playerid,str,1000,3);
  117. }
  118.  
  119. tmp = vy*vy + vz*vz;
  120. if( tmp > 0.005 ) wheelie = -asin( vz / floatsqroot(tmp) );
  121.  
  122. wheelie_speed = floatabs(Diff(wheelie,Wheelie[playerid],WHEELIE_SAMPLES+1)) / 4.0;
  123.  
  124. /* if( (abs(drift) > 1.0) && (sign(angle_speed) != sign(drift)) && (-0.015 <= a) )
  125. {
  126. format(str,sizeof(str),"~n~~n~~n~~n~~n~~n~~n~~n~~b~~h~~h~~h~%.1f",drift);
  127. GameTextForPlayer(playerid,str,1000,3);
  128. }
  129. */
  130. if((keys&40) == 8 && (keys&4096 || updown == KEY_DOWN))
  131. {
  132. if( ACCELERATION_SENSITIVITY < (a * (wheelie_speed + (wheelie > 5.0 ? 1.0 : 0.0))) )
  133. {
  134. x = ((a > 0.0) ? (a) : (a/2.0)); y = 0.0; z = 0.0;
  135. RotateVector(x,z,y, matrix);
  136. SetVehicleAngularVelocity(vehicleid,x,y,z);
  137.  
  138. //format(str,sizeof(str),"~n~~n~~n~~n~~n~~n~~n~~n~~y~~h~%.1f",wheelie);
  139. //GameTextForPlayer(playerid,str,1000,3);
  140. }
  141. }
  142. }
  143. }
  144.  
  145. public OnPlayerConnect(playerid)
  146. {
  147. //=============================================
  148. /* new i = playerid;
  149. do
  150. i = (i - 1) % (MAX_PLAYERS + 1);
  151. while( i != MAX_PLAYERS && PlayerIDs[i] == -1 );
  152. PlayerIDs[playerid] = PlayerIDs[i];
  153. PlayerIDs[i] = playerid;*/
  154. //=============================================
  155.  
  156. WheelieAllow[playerid/32] &= ~(1<<(playerid%32)); // Initialize to 0 (disallow player to do wheelie)
  157.  
  158. return 1;
  159. }
  160.  
  161. public OnPlayerDisconnect(playerid, reason)
  162. {
  163. #pragma unused reason
  164.  
  165. //=====================================
  166. /* new i = playerid;
  167. while( --i >= 0 )
  168. if( PlayerIDs[i] > 0 ) break;
  169. i %= (MAX_PLAYERS + 1);
  170. PlayerIDs[i] = PlayerIDs[playerid];
  171. PlayerIDs[playerid] =- 1;*/
  172. //=====================================
  173.  
  174. return 1;
  175. }
  176.  
  177. public OnPlayerStateChange(playerid, newstate,oldstate)
  178. {
  179. if(newstate == PLAYER_STATE_DRIVER)
  180. {
  181. if( nfind(GetVehicleModel(GetPlayerVehicleID(playerid)),ForbiddenVehicles) < 0 ){
  182. WheelieAllow[playerid/32] |= 1<<(playerid%32); // Allow played do wheelie
  183. return 1;
  184. }
  185. }
  186. WheelieAllow[playerid/32] &= ~(1<<(playerid%32)); // Disallow to do wheelie
  187. return 1;
  188. }
  189.  
  190. stock nfind(x, const array[], size = sizeof(array))
  191. {
  192. for(new i = 0; i < size; i++)
  193. if(array[i] == x) return i;
  194. return -1;
  195. }
  196.  
  197. stock Quat2Matrix33(Float:w,Float:x,Float:y,Float:z, Float:m[9])
  198. {
  199. new
  200. Float: xx = x * x,
  201. Float: xy = x * y,
  202. Float: xz = x * z,
  203. Float: wx = w * x,
  204. Float: yy = y * y,
  205. Float: yz = y * z,
  206. Float: wy = w * y,
  207. Float: zz = z * z,
  208. Float: wz = w * z;
  209.  
  210. m[0] = 1.0-2.0*(yy+zz); m[1] = 2.0*(xy-wz); m[2] = 2.0*(wy+xz);
  211. m[3] = 2.0*(xy+wz); m[4] = 1.0-2.0*(xx+zz); m[5] = 2.0*(yz-wx);
  212. m[6] = 2.0*(xz-wy); m[7] = 2.0*(wx+yz); m[8] = 1.0-2.0*(xx+yy);
  213. return 1;
  214. }
  215.  
  216. stock RotateVector(&Float:vx,&Float:vy,&Float:vz, Float:m[9])
  217. {
  218. new
  219. Float:x = m[0]*vx + m[1]*vy + m[2]*vz,
  220. Float:y = m[3]*vx + m[4]*vy + m[5]*vz,
  221. Float:z = m[6]*vx + m[7]*vy + m[8]*vz;
  222. vx=x,vy=y,vz=z;
  223. return 1;
  224. }
  225.  
  226. stock GetVehicleVelocityFloatVehicle(vehicleid, &Float:X, &Float:Y, &Float:Z)
  227. {
  228. new Float:w,Float:x,Float:y,Float:z,Float:m[9];
  229. GetVehicleRotationQuat(vehicleid,w,x,y,z);
  230. GetVehicleVelocity(vehicleid,X,Y,Z);
  231. x=-x; y=-y; z=-z;
  232. Quat2Matrix33(w,x,z,y, m);
  233. RotateVector(X,Z,Y, m);
  234. }
  235. forward Float: Diff(Float:x, Float:tab[], size = sizeof(tab));
  236. stock Float: Diff(Float:x, Float:tab[], size = sizeof(tab))
  237. {
  238. if(size < 2) return 0.0;
  239.  
  240. new i, Float: y;
  241.  
  242. y = x - tab[0];
  243. tab[0] = x;
  244.  
  245. for(i = size - 1; i > 1; i --)
  246. tab[i] = tab[i-1];
  247. tab[1] = y; // shift
  248.  
  249. for(i = 2; i < size; i++)
  250. y += tab[i];
  251. y /= float(size - 1); // mean
  252.  
  253. return y;
  254. }
Advertisement
Add Comment
Please, Sign In to add comment