Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * SA-MP Wheelie filterscript made by Gesior7
- *
- */
- #include a_samp
- #include PlayerConnect
- #define SPEED_SAMPLES 5
- #define WHEELIE_SAMPLES 5
- #define ACCELERATION_SENSITIVITY 0.005
- #assert SPEED_SAMPLES > 0
- #define ceildiv(%1,%2) (((%1) + (%2) - 1) / (%2)) // Taken from YSI_misc.own.
- #define abs(%1) (((%1)<0)?(-(%1)):(%1))
- #define sign(%1) (((%1)<0)?(-1):(1))
- //#define forAll(%1) for(%1=PlayerIDs[MAX_PLAYERS]; %1!=-1; %1=PlayerIDs[%1])
- //new PlayerIDs[MAX_PLAYERS+1]={-1,...};
- new WheelieTimer;
- //new PlayerTickCount[MAX_PLAYERS] = {0,...};
- new Float: Wheelie[MAX_PLAYERS][WHEELIE_SAMPLES+1];
- new Float: Drift[MAX_PLAYERS];
- new Float: PlayerSpeed[MAX_PLAYERS][SPEED_SAMPLES+1];
- new WheelieAllow[ceildiv(MAX_PLAYERS,32)] = {0,...};
- static const ForbiddenVehicles[] =
- {
- 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,
- 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,
- 606, 607, 608, 610, 611
- };
- public OnFilterScriptInit()
- {
- new playerstate;
- for(new i = 0, j = GetMaxPlayers(); i < j; i++){
- if(!IsPlayerConnected(i)) continue;
- //OnPlayerConnect(i);
- playerstate = GetPlayerState(i);
- OnPlayerStateChange(i, playerstate, playerstate);
- }
- WheelieTimer = SetTimer("Car",50,1);
- return 1;
- }
- public OnFilterScriptExit()
- {
- KillTimer(WheelieTimer);
- return 1;
- }
- forward Car();
- public Car()
- {
- new playerid;
- for(Players;playerid)
- {
- if(!(WheelieAllow[playerid/32] & (1<<(playerid%32)))) continue;
- new vehicleid = GetPlayerVehicleID(playerid);
- if(!vehicleid) continue;
- new Float:w,Float:x,Float:y,Float:z;
- new Float:v,Float:a,Float:matrix[9];
- new Float:vx,Float:vy,Float:vz;
- new keys,updown,leftright;
- new Float:matrix_conj[9];
- new //Float: drift = 0.0,
- Float: wheelie = 0.0,
- Float: wheelie_speed,
- Float: angle_speed;
- GetPlayerKeys(playerid,keys,updown,leftright);
- GetVehicleVelocity(vehicleid,vx,vy,vz);
- GetVehicleZAngle(vehicleid,a);
- angle_speed = a - Drift[playerid];
- Drift[playerid] = a;
- if( 180.0 <= angle_speed ) angle_speed -= 360.0;
- else
- if( angle_speed <= -180.0 ) angle_speed += 360.0;
- v = vy*floatcos(a,degrees) - vx*floatsin(a,degrees);
- //v = floatsqroot(vx*vx+vy*vy/*+vz*vz*/);
- a = Diff(v,PlayerSpeed[playerid],SPEED_SAMPLES+1);
- GetVehicleRotationQuat(vehicleid,w,x,y,z);
- Quat2Matrix33(w,x,z,y, matrix);
- Quat2Matrix33(w,-x,-z,-y, matrix_conj);
- RotateVector(vx,vz,vy, matrix_conj);
- new Float: tmp;
- //new str[128];
- tmp = vx*vx + vy*vy;
- // if( tmp > 0.005 ) drift = -asin( vx / floatsqroot(tmp) );
- if( (Float:(_:vz & 0x7FFFFFFF) > 0.2) && tmp > 0.005 ) {
- tmp = vz / floatsqroot(tmp);
- new str[32];
- format(str, 32, "~n~~n~~n~~n~%s", ((tmp > 0.5)?("~w~"):("~r~")), tmp);
- GameTextForPlayer(playerid,str,1000,3);
- }
- tmp = vy*vy + vz*vz;
- if( tmp > 0.005 ) wheelie = -asin( vz / floatsqroot(tmp) );
- wheelie_speed = floatabs(Diff(wheelie,Wheelie[playerid],WHEELIE_SAMPLES+1)) / 4.0;
- /* if( (abs(drift) > 1.0) && (sign(angle_speed) != sign(drift)) && (-0.015 <= a) )
- {
- format(str,sizeof(str),"~n~~n~~n~~n~~n~~n~~n~~n~~b~~h~~h~~h~%.1f",drift);
- GameTextForPlayer(playerid,str,1000,3);
- }
- */
- if((keys&40) == 8 && (keys&4096 || updown == KEY_DOWN))
- {
- if( ACCELERATION_SENSITIVITY < (a * (wheelie_speed + (wheelie > 5.0 ? 1.0 : 0.0))) )
- {
- x = ((a > 0.0) ? (a) : (a/2.0)); y = 0.0; z = 0.0;
- RotateVector(x,z,y, matrix);
- SetVehicleAngularVelocity(vehicleid,x,y,z);
- //format(str,sizeof(str),"~n~~n~~n~~n~~n~~n~~n~~n~~y~~h~%.1f",wheelie);
- //GameTextForPlayer(playerid,str,1000,3);
- }
- }
- }
- }
- public OnPlayerConnect(playerid)
- {
- //=============================================
- /* new i = playerid;
- do
- i = (i - 1) % (MAX_PLAYERS + 1);
- while( i != MAX_PLAYERS && PlayerIDs[i] == -1 );
- PlayerIDs[playerid] = PlayerIDs[i];
- PlayerIDs[i] = playerid;*/
- //=============================================
- WheelieAllow[playerid/32] &= ~(1<<(playerid%32)); // Initialize to 0 (disallow player to do wheelie)
- return 1;
- }
- public OnPlayerDisconnect(playerid, reason)
- {
- #pragma unused reason
- //=====================================
- /* new i = playerid;
- while( --i >= 0 )
- if( PlayerIDs[i] > 0 ) break;
- i %= (MAX_PLAYERS + 1);
- PlayerIDs[i] = PlayerIDs[playerid];
- PlayerIDs[playerid] =- 1;*/
- //=====================================
- return 1;
- }
- public OnPlayerStateChange(playerid, newstate,oldstate)
- {
- if(newstate == PLAYER_STATE_DRIVER)
- {
- if( nfind(GetVehicleModel(GetPlayerVehicleID(playerid)),ForbiddenVehicles) < 0 ){
- WheelieAllow[playerid/32] |= 1<<(playerid%32); // Allow played do wheelie
- return 1;
- }
- }
- WheelieAllow[playerid/32] &= ~(1<<(playerid%32)); // Disallow to do wheelie
- return 1;
- }
- stock nfind(x, const array[], size = sizeof(array))
- {
- for(new i = 0; i < size; i++)
- if(array[i] == x) return i;
- return -1;
- }
- stock Quat2Matrix33(Float:w,Float:x,Float:y,Float:z, Float:m[9])
- {
- new
- Float: xx = x * x,
- Float: xy = x * y,
- Float: xz = x * z,
- Float: wx = w * x,
- Float: yy = y * y,
- Float: yz = y * z,
- Float: wy = w * y,
- Float: zz = z * z,
- Float: wz = w * z;
- m[0] = 1.0-2.0*(yy+zz); m[1] = 2.0*(xy-wz); m[2] = 2.0*(wy+xz);
- m[3] = 2.0*(xy+wz); m[4] = 1.0-2.0*(xx+zz); m[5] = 2.0*(yz-wx);
- m[6] = 2.0*(xz-wy); m[7] = 2.0*(wx+yz); m[8] = 1.0-2.0*(xx+yy);
- return 1;
- }
- stock RotateVector(&Float:vx,&Float:vy,&Float:vz, Float:m[9])
- {
- new
- Float:x = m[0]*vx + m[1]*vy + m[2]*vz,
- Float:y = m[3]*vx + m[4]*vy + m[5]*vz,
- Float:z = m[6]*vx + m[7]*vy + m[8]*vz;
- vx=x,vy=y,vz=z;
- return 1;
- }
- stock GetVehicleVelocityFloatVehicle(vehicleid, &Float:X, &Float:Y, &Float:Z)
- {
- new Float:w,Float:x,Float:y,Float:z,Float:m[9];
- GetVehicleRotationQuat(vehicleid,w,x,y,z);
- GetVehicleVelocity(vehicleid,X,Y,Z);
- x=-x; y=-y; z=-z;
- Quat2Matrix33(w,x,z,y, m);
- RotateVector(X,Z,Y, m);
- }
- forward Float: Diff(Float:x, Float:tab[], size = sizeof(tab));
- stock Float: Diff(Float:x, Float:tab[], size = sizeof(tab))
- {
- if(size < 2) return 0.0;
- new i, Float: y;
- y = x - tab[0];
- tab[0] = x;
- for(i = size - 1; i > 1; i --)
- tab[i] = tab[i-1];
- tab[1] = y; // shift
- for(i = 2; i < size; i++)
- y += tab[i];
- y /= float(size - 1); // mean
- return y;
- }
Advertisement
Add Comment
Please, Sign In to add comment