Вычисление дрифта
#1

PHP Code:
public Drift()
{
    new 
Float:Angle1, Float:Angle2, Float:BySpeed, s[128];
    new 
Float:Z, Float:X, Float:Y;
    new 
Float:SpeedX;
    for(new 
g = 0; g < MAX_PLAYERS; g++)
    {
        
GetPlayerPos(g, X, Y, Z);
        
SpeedX = floatsqroot(floatadd(floatadd(floatpower(floatabs(floatsub(X,SavedPos[ g ][ sX ])),2),floatpower(floatabs(floatsub(Y,SavedPos[ g ][ sY ])),2)),floatpower(floatabs(floatsub(Z,SavedPos[ g ][ sZ ])),2)));
        
Angle1 = ReturnPlayerAngle(g);
        
Angle2 = GetPlayerTheoreticAngle(g);
        
BySpeed = floatmul(SpeedX, 12);
        if(
IsPlayerInAnyVehicle(g) && IsCar(GetPlayerVehicleID(g)) && floatabs(floatsub(Angle1, Angle2)) > DRIFT_MINKAT && floatabs(floatsub(Angle1, Angle2)) < DRIFT_MAXKAT && BySpeed > DRIFT_SPEED)
        {
            if(
PlayerDriftCancellation[g] > 0) KillTimer(PlayerDriftCancellation[g]);
            
PlayerDriftCancellation[g] = 0;
            
DriftPointsNow[g] += 10;
            
scores[g]++;
            
PlayerDriftCancellation[g] = SetTimerEx("DriftCancellation", 2000, 0, "d", g);
        }
        if(
DriftPointsNow[g] > 0)
        {
            if(
scplay[g] == 1)
            {
                
TextDrawShowForPlayer(g,Chet[g]);
                
format(s, sizeof(s), "Drift: ~g~+%d$", DriftPointsNow[g]);
                
TextDrawSetString(Chet[g], s);
            }
        }
        
SavedPos[ g ][ sX ] = X;
        
SavedPos[ g ][ sY ] = Y;
        
SavedPos[ g ][ sZ ] = Z;
    }
    return 
1;
} 
У меня чё то этот код не прет....Мож у кого есть чё по легче?
Reply
#2

Drift Point Counter Plugin
Reply
#3

Функция вычисления угла дрифта:
PHP Code:
stock Float:GetVehicleDriftAngle(Float:x,Float:y,Float:a)
{
    new 
Float:unit_interval = floatsqroot(x*x + y*y);
    new 
Float:arcsin = asin( y/unit_interval );
    new 
Float:arccos = acos( x/unit_interval );
    new 
Float:angle;
    if(
arcsin >= 0.0) angle = arccos;
    else 
angle = 360.0 - arccos;
    
a += 90.0;
    if(
a >= 360.0) a -= 360.0;
    if(
angle > a) return angle-a;
    else return 
a-angle;
} 
Float,Float:y - GetVehicleVelocity(), Float:a - поворот машины

//-------------------
IsPlayerInAnyVehicle(g) - почему бы не сделать проверку только на водителя?
если даже врезаться то очки не снимает =/
Reply
#4

White_116 можешь пример показать использование этой функции?
Reply
#5

PHP Code:
stock Float:GetVehicleDriftAngle(vehicleid)
{
    new 
Float:x, Float:y, Float:z;
    
GetVehicleVelocity(vehicleid, x, y, z);
    new 
Float:unit_interval = floatsqroot(x*x + y*y);
    new 
Float:arcsin = asin( y/unit_interval );
    new 
Float:arccos = acos( x/unit_interval );
    new 
Float:angle;
    
    if(
arcsin >= 0.0) angle = arccos;
    else 
angle = 360.0 - arccos;
    
    new 
Float:real_angle;
    
GetVehicleZAngle(vehicleid, real_angle);
    
real_angle += 90.0;
    if(
real_angle >= 360.0) real_angle -= 360.0;
    
    if(
angle > real_angle) return angle-real_angle;
    else return 
real_angle-angle;
} 
пы.сы: с пастебина.
Reply
#6

вот укоротил то что раньше кидал

PHP Code:
stock Float:GetVehicleDriftAngle(Float:x,Float:y,Float:a)
{
    new 
Float:Angle = floatsqroot(x*x + y*y);
    if((
asin( x/Angle )*-1) <= 0.0)Angle = 360.0 - acos( y/Angle );
    else 
Angle = acos( y/Angle );
    
    if(
Angle > a)
    {
        if(
Angle-a>180.0)return (360.0-Angle)+a;
        else return 
Angle-a;
    }
    else
    {
        if(
a-Angle>180.0)return (360.0-a)+Angle;
        else return 
a-Angle;
    }
} 
//---------------------
Исправил баг с углом, когда он был больше 180.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)