SA-MP Forums Archive
Вычисление дрифта - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: Non-English (https://sampforum.blast.hk/forumdisplay.php?fid=9)
+--- Forum: Languages (https://sampforum.blast.hk/forumdisplay.php?fid=33)
+---- Forum: Русский/Russian (https://sampforum.blast.hk/forumdisplay.php?fid=32)
+---- Thread: Вычисление дрифта (/showthread.php?tid=341936)



Вычисление дрифта - Hawkins - 12.05.2012

PHP Code:
public Drift()
{
    new 
Float:Angle1Float:Angle2Float:BySpeeds[128];
    new 
Float:ZFloat:XFloat:Y;
    new 
Float:SpeedX;
    for(new 
0MAX_PLAYERSg++)
    {
        
GetPlayerPos(gXYZ);
        
SpeedX floatsqroot(floatadd(floatadd(floatpower(floatabs(floatsub(X,SavedPos][ sX ])),2),floatpower(floatabs(floatsub(Y,SavedPos][ sY ])),2)),floatpower(floatabs(floatsub(Z,SavedPos][ sZ ])),2)));
        
Angle1 ReturnPlayerAngle(g);
        
Angle2 GetPlayerTheoreticAngle(g);
        
BySpeed floatmul(SpeedX12);
        if(
IsPlayerInAnyVehicle(g) && IsCar(GetPlayerVehicleID(g)) && floatabs(floatsub(Angle1Angle2)) > DRIFT_MINKAT && floatabs(floatsub(Angle1Angle2)) < DRIFT_MAXKAT && BySpeed DRIFT_SPEED)
        {
            if(
PlayerDriftCancellation[g] > 0KillTimer(PlayerDriftCancellation[g]);
            
PlayerDriftCancellation[g] = 0;
            
DriftPointsNow[g] += 10;
            
scores[g]++;
            
PlayerDriftCancellation[g] = SetTimerEx("DriftCancellation"20000"d"g);
        }
        if(
DriftPointsNow[g] > 0)
        {
            if(
scplay[g] == 1)
            {
                
TextDrawShowForPlayer(g,Chet[g]);
                
format(ssizeof(s), "Drift: ~g~+%d$"DriftPointsNow[g]);
                
TextDrawSetString(Chet[g], s);
            }
        }
        
SavedPos][ sX ] = X;
        
SavedPos][ sY ] = Y;
        
SavedPos][ sZ ] = Z;
    }
    return 
1;

У меня чё то этот код не прет....Мож у кого есть чё по легче?


Re: Вычисление дрифта - iEnemY - 12.05.2012

Drift Point Counter Plugin


Re: Вычисление дрифта - White_116 - 12.05.2012

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

Float,Float:y - GetVehicleVelocity(), Float:a - поворот машины

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


Re: Вычисление дрифта - Hawkins - 12.05.2012

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


Re: Вычисление дрифта - Evansive - 12.05.2012

PHP Code:
stock Float:GetVehicleDriftAngle(vehicleid)
{
    new 
Float:xFloat:yFloat:z;
    
GetVehicleVelocity(vehicleidxyz);
    new 
Float:unit_interval floatsqroot(x*y*y);
    new 
Float:arcsin asiny/unit_interval );
    new 
Float:arccos acosx/unit_interval );
    new 
Float:angle;
    
    if(
arcsin >= 0.0angle arccos;
    else 
angle 360.0 arccos;
    
    new 
Float:real_angle;
    
GetVehicleZAngle(vehicleidreal_angle);
    
real_angle += 90.0;
    if(
real_angle >= 360.0real_angle -= 360.0;
    
    if(
angle real_angle) return angle-real_angle;
    else return 
real_angle-angle;

пы.сы: с пастебина.


Re: Вычисление дрифта - White_116 - 12.05.2012

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

PHP Code:
stock Float:GetVehicleDriftAngle(Float:x,Float:y,Float:a)
{
    new 
Float:Angle floatsqroot(x*y*y);
    if((
asinx/Angle )*-1) <= 0.0)Angle 360.0 acosy/Angle );
    else 
Angle acosy/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.