Skip to content

Instantly share code, notes, and snippets.

@Seregamil
Last active August 29, 2015 14:01
Show Gist options
  • Select an option

  • Save Seregamil/f14b3bc24fbbee7490f5 to your computer and use it in GitHub Desktop.

Select an option

Save Seregamil/f14b3bc24fbbee7490f5 to your computer and use it in GitHub Desktop.
DriftSystem
//by Seregamil
#include a_samp
#define void%0(%1) forward%0(%1); public%0(%1)
#define MINIMAL_ANGLE (12.5)
#define MAXIMAL_ANGLE (90.0)
#define MINIMAL_SPEED (15.0)
native IsValidVehicle(vehicleid);
main(){}
new d_timer[ MAX_PLAYERS ], driftPoints[ MAX_PLAYERS ], driftWaiting[ MAX_PLAYERS ];
new Float: saved_angle[ MAX_PLAYERS ], Float: saved_health[ MAX_PLAYERS ];
public OnGameModeInit(){
return true;
}
public OnPlayerConnect(playerid){
return true;
}
public OnPlayerDisconnect(playerid, reason){
KillTimer( d_timer[ playerid ] );
return true;
}
/*public OnPlayerCommandText(playerid, cmdtext[]){
new Float: x, Float: y, Float: z, Float: a;
GetPlayerPos( playerid, x, y, z );
GetPlayerFacingAngle( playerid, a );
PutPlayerInVehicle( playerid, CreateVehicle( 411, x, y, z, a, 1, 1, 999999 ), 0 );
return SendClientMessage(playerid, -1, "Command is not exist");
}*/
public OnPlayerStateChange(playerid, newstate, oldstate){
switch( newstate ){
case PLAYER_STATE_DRIVER: {
new vehicleid = GetPlayerVehicleID( playerid );
if( isDriftingVehicle( GetVehicleModel( vehicleid ) ) ){
GetVehicleZAngle( vehicleid, saved_angle[ playerid ] );
GetVehicleHealth( vehicleid, saved_health[ playerid ] );
d_timer[ playerid ] = SetTimerEx( "driftUpdate", 200, true, "ii", playerid, vehicleid );
}
}
default:
KillTimer( d_timer[ playerid ] );
}
return true;
}
void driftUpdate( playerid, vehicleid ){
if( ( !IsPlayerConnected( playerid ) ) || ( !IsValidVehicle( vehicleid ) ) || ( !IsPlayerInVehicle( playerid, vehicleid ) ) ){
saved_angle[ playerid ] = 0.0;
KillTimer( d_timer[ playerid ] );
return ;
}
new Float: velocity_x, Float: velocity_y, Float: velocity_z;
GetVehicleVelocity( vehicleid, velocity_x, velocity_y, velocity_z );
new Float: vehicle_speed = ( ( velocity_x * velocity_x + velocity_y * velocity_y + velocity_z * velocity_z ) * 195.0 );
if( vehicle_speed < MINIMAL_SPEED ) {
GetVehicleZAngle( vehicleid, saved_angle[ playerid ] );
GetVehicleHealth( vehicleid, saved_health[ playerid ] );
return ;
}
new Float: vehicle_angle;
GetVehicleZAngle( vehicleid, vehicle_angle );
new Float: vehicle_health;
GetVehicleHealth( vehicleid, vehicle_health );
if( vehicle_health < saved_health[ playerid ] ) {
SendClientMessage(playerid, -1, "Crash");
saved_angle[ playerid ] = vehicle_angle;
saved_health[ playerid ] = vehicle_health;
if( driftPoints[ playerid ] > 0 ) driftPoints[ playerid ] = 0;
if( driftWaiting[ playerid ] > 0 ) driftWaiting[ playerid ] = 0;
ResetPlayerMoney( playerid );
return ;
}
new Float: calculate = floatabs( saved_angle[ playerid ] - vehicle_angle );
if( MINIMAL_ANGLE < calculate < MAXIMAL_ANGLE ){
driftPoints[ playerid ] += floatround( calculate );
GivePlayerMoney( playerid, driftPoints[ playerid ] );
}
else
if( driftPoints[ playerid ] > 0 && ++driftWaiting[ playerid ] == 10 )
driftPoints[ playerid ] = 0, driftWaiting[ playerid ] = 0, ResetPlayerMoney( playerid );
saved_angle[ playerid ] = vehicle_angle;
saved_health[ playerid ] = vehicle_health;
}
isDriftingVehicle( vehicleid ){
switch( vehicleid ){
case 448,461,462,468,481,509,521,522,581,537,538,523,417,425,447,460,469,476,487,488,497,511,512,513,519,520,548,553,563,577,592,593,430,446,452,454,472,473,453,484,493,595,464:
return false;
}
return true;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment