Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.

Реклама


**Как получить V.I.P** (Перейти)
Чтобы заказать рекламу на Pro-Pawn.Ru, обращайтесь в Skype.
Баннерная реклама 200руб/мес, Текстовая 100руб/мес.
Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 16
  1. #1
    Аватар для [ForD]
    Пользователь

    Статус
    Оффлайн
    Регистрация
    14.11.2013
    Адрес
    Свердловская обл.
    Сообщений
    702
    Репутация:
    104 ±

    Drift Points Counter Plug-In by Gamer_Z (RUS)

    Данный пост будет представлять собой небольшой разбор плагина подсчета дрифт-очков by Gamer_Z


    Плагин имеет ряд функций и колбэков которые существенно упрощают работу над какими-либо скриптами и т.п. использующие подсчет дрифт очков.



     Получает/Устанавливает интервал между обновлениями дрифта.

    Получает/Устанавливает интервал между обновлениями дрифта.(В тиках, не секундах или миллисекундах!)
     DriftSet_UpdateDelay

    PHP код:
    native DriftSet_UpdateDelay(delay); 
     Пример

    PHP код:
     public OnFilterScriptInit()
     {
         
    DriftSet_UpdateDelay(5);
         
    //Приведенный выше код будет устанавливать интервал обновления дрифта в 5 тиков.
         
    return 1;
     } 

    Эта функция не возвращает никакого значения

     DriftGet_UpdateDelay
    PHP код:
    native DriftGet_UpdateDelay(); 
     Пример

    PHP код:
    public OnFilterScriptInit()
     {
            new 
    delay 0;//переменная
            
    delay DriftGet_UpdateDelay();//Сохраняет количество тиков в переменной
            
    if(<= delay <= 15)//если интервал между 5 и 15
            
    {
                
    DriftSet_UpdateDelay(7);//установим интервал на 7
            
    }
            else
            {
                
    DriftSet_UpdateDelay(12);//установить интервал на 12
            
    }
            
    //Этот код будет становить интервал на 7 или на 12 тиков.
            
    return 1;
     } 

    Возвращает количество тиков между обновлениями дрифта.



     Получает/Устанавливает минимальную скорость дрифта.

    Получает/Устанавливает минимальную скорость дрифта.
     DriftSet_MinimalSpeed
    PHP код:
    native DriftSet_MinimalSpeed(Float:MinimalSpeed,playerid = (-1)); 
     Пример

    PHP код:
    public OnFilterScriptInit()
     {
         
    DriftSet_MinimalSpeed(15.0);
         
    //Приведенный выше код установит для всех игроков минимальную скорость для подсчета дрифта в размере 15 км/ч
         
    DriftSet_MinimalSpeed(15.0,33);
         
    //Приведенный выше код установит для playerid 33 минимальную скорость для подсчета дрифта в размере 15 км/ч

         //(если зайти в дрифт на скорости меньше 15 км/ч,то дрифт засчитываться не будет!)
         
    return 1;
     } 

    Эта функция не возвращает никакого значения.

     DriftGet_MinimalSpeed
    PHP код:
    native DriftGet_MinimalSpeed(&Float:MinimalSpeed,playerid = (0)); 
     Пример

    PHP код:
    public OnFilterScriptInit()
    {
            new 
    Float:Speed;//Переменная типа float(с плавающей точкой)
            
    DriftGet_MinimalSpeed(Speed);
            
    //Код выше получает минимальную скорость для подсчета дрифта и передает данные в переменную Speed
            
    DriftGet_MinimalSpeed(Speed,45);
            
    //Код выше получает минимальную скорость для подсчета дрифта от playerid 45 и передает данные в переменную Speed
            #define MAX_PLAYERS (500)
            
    new Float:AllSpeed[MAX_PLAYERS];//Переменная типа float(с плавающей точкой)
            
    for(new iMAX_PLAYERS; ++i)
            {
                    
    DriftGet_MinimalSpeed(AllSpeed[i],i);
            }       
            
    //Код выше будет получать минимальную скорость для подсчета дрифта от всех игроков и передает ее в массив AllSpeed что-бы проверить всех игроков на значение минимальной скорости подсчета дрифта
            
    new IsEverybodySynced 1;//присвоим новой переменной 1
            
    for(new iMAX_PLAYERS-1; ++i)
            {
                    if(
    AllSpeed[i] != AllSpeed[i+1])
                    {
                            
    IsEverybodySynced 0;//Если не все имеют одинаковую минимальную скорость подсчета дрифта
                            
    break;//Выйдем из цикла,"мы получили то,что мы хотели"
                    
    }
            }
            if(
    IsEverybodySynced == 0)
            {
                    print(
    "Не все имеют одинаковую минимальную скорость подсчета дрифта!");
            }
            return 
    1;


    Эта функция не возвращает никакого значения.



     Получает/Устанавливает максимальную скорость дрифта.

    Получает/Устанавливает максимальную скорость дрифта.
     DriftSet_MaximalSpeed
    PHP код:
    native DriftSet_MaximalSpeed(Float:MaximalSpeed,playerid = (-1)); 
     Пример

    PHP код:
    public OnFilterScriptInit()
     {
         
    DriftSet_MaximalSpeed(100.0);
         
    //Приведенный выше код установит для всех игроков максимальную скорость для подсчета дрифта в размере 100 км/ч
         
    DriftSet_MaximalSpeed(100.0,33);
         
    //Приведенный выше код установит для playerid 33 максимальную скорость для подсчета дрифта в размере 100 км/ч

         //(если зайти в дрифт на скорости больше 100 км/ч,то дрифт засчитываться не будет!)
         
    return 1;
     } 

    Эта функция не возвращает никакого значения.

     DriftGet_MaximalSpeed
    PHP код:
    native DriftGet_MaximalSpeed(&Float:MaximalSpeed,playerid = (0)); 
     Пример

    PHP код:
    public OnFilterScriptInit()
    {
            new 
    Float:Speed;//Переменная типа float(с плавающей точкой)
            
    DriftGet_MaximalSpeed(Speed);
            
    //Код выше получает максимальную скорость для подсчета дрифта и передает данные в переменную Speed
            
    DriftGet_MaximalSpeed(Speed,45);
            
    //Код выше получает максимальную скорость для подсчета дрифта от playerid 45 и передает данные в переменную Speed
            #define MAX_PLAYERS (500)
            
    new Float:AllSpeed[MAX_PLAYERS];//Переменная типа float(с плавающей точкой)
            
    for(new iMAX_PLAYERS; ++i)
            {
                    
    DriftGet_MaximalSpeed(AllSpeed[i],i);
            }       
            
    //Код выше будет получать максимальную скорость для подсчета дрифта от всех игроков и передает ее в массив AllSpeed что-бы проверить всех игроков на значение максимальной скорости подсчета дрифта
            
    new IsEverybodySynced 1;//присвоим новой переменной 1
            
    for(new iMAX_PLAYERS-1; ++i)
            {
                    if(
    AllSpeed[i] != AllSpeed[i+1])
                    {
                            
    IsEverybodySynced 0;//Если не все имеют одинаковую максимальную скорость подсчета дрифта
                            
    break;//Выйдем из цикла,"мы получили то,что мы хотели"
                    
    }
            }
            if(
    IsEverybodySynced == 0)
            {
                    print(
    "Не все имеют одинаковую максимальную скорость подсчета дрифта!");
            }
            return 
    1;


    Эта функция не возвращает никакого значения.



     Получает/Устанавливает минимальный угол дрифта.

    Получает/Устанавливает минимальный угол дрифта.
     DriftSet_MinimalAngle

    PHP код:
    native DriftSet_MinimalAngle(Float:MinimalAngle,playerid = (-1)); 
     Пример

    PHP код:
     public OnFilterScriptInit()
     {
            
    DriftSet_MinimalAngle(15.0);
            
    //Приведенный выше код устанавливает минимальный угол в расчета дрифта размере 15.0 для всех игроков
            
    DriftSet_MinimalAngle(15.0,12);
            
    //Приведенный выше код устанавливает минимальный угол в расчета дрифта размере 15.0 для playerid 12
            
    return 1;
     } 

    Эта функция не возвращает никакого значения.

     DriftGet_MinimalAngle
    PHP код:
    native DriftGet_MinimalAngle(&Float:MinimalAngle,playerid = (0)); 
     Пример

    PHP код:
    public OnPlayerDriftStart(playerid)
     {
            
    DriftSet_MinimalAngle(12.5,playerid);
            
    //Приведенный выше код устанавливает минимальный угол в расчета дрифта размере 12.5 для playerid
            
    return 1;
     }
     
    public 
    OnPlayerDriftUpdate(playerid,value,combo,flagid,Float:distance,Float:speed)
     {
            if(
    combo 50 == 0//Если деление комбо на 50
            //as many as possible leaves us with rest of 0
            //example: 150-50 = 100, 100-50 = 50, 50-50 = 0 so we get rest of 0.
            //example two: 143-50 = 93, 93 - 50 = 43, rest is 43, it is not equal to 0
            //note: why? -> 43 is not dividable by 50 so it is the remaining rest!
            
    {
                new 
    Float:minangle;//Объявляем переменную типа float
                
    DriftGet_MinimalAngle(minangle,playerid);//Получаем минимальный угол игрока
                
    if(minangle+0.5 65.0)//Если минимальный угол 0.5 меньше 65 градусов
                    
    {
                            
    DriftSet_MinimalAngle(minangle+0.5,playerid);
                            
    //if yes add 0.5 degrees to the minimal angle to make it harder
                            //to drift
                    
    }
            }
            return 
    1;
     } 

    Эта функция не возвращает никакого значения.



     Получает/Устанавливает максимальный угол дрифта.

    Получает/Устанавливает максимальный угол дрифта.
     DriftSet_MaximalAngle
    PHP код:
    native DriftSet_MaximalAngle(Float:MaximalAngle,playerid = (-1)); 
     Пример

    PHP код:
     public OnFilterScriptInit()
     {
            
    DriftSet_MaximalAngle(90);
            
    //Приведенный выше код устанавливает максимальный угол в расчета дрифта размере 90 для всех игроков
            
    DriftSet_MaximalAngle(90,12);
            
    //Приведенный выше код устанавливает максимальный угол в расчета дрифта размере 90 для playerid 12
            
    return 1;
     } 

    Эта функция не возвращает никакого значения.

     DriftGet_MaximalAngle
    PHP код:
    native DriftGet_MaximalAngle(&Float:MaximalAngle,playerid = (0)); 
     Пример
    PHP код:


    Эта функция не возвращает никакого значения.



     Получает/Устанавливает задержку окончания дрифта в тиках.

    Получает/Устанавливает задержку окончания дрифта в тиках.

     DriftSet_StartEndDelay
    PHP код:
    native DriftSet_StartEndDelay(delay,playerid = (-1)); 
     Пример

    PHP код:
     public OnFilterScriptInit()
     {
            
    DriftSet_StartEndDelay(20);
            
    //Приведенный выше код устанавливает задержку дрифта до 20 тиков для всех игроков
            
    DriftSet_StartEndDelay(20,23);
            
    //Приведенный выше код устанавливает задержку дрифта до 20 тиков для plyerid 23
            
    return 1;
     }
    //Функция устанавливает кол-во тиков до полной остановки набора дрифт очков. 

    Эта функция не возвращает никакого значения.

     DriftGet_StartEndDelay
    PHP код:
    native DriftGet_StartEndDelay(playerid = (0)); 
     Пример

    PHP код:
     public OnFilterScriptInit()
     {
            new 
    playerdelay 0;
            
    playerdelay DriftGet_StartEndDelay(0);
            
    //Приведенный выше код получает кол-во тиков до полной остановки подсчета дрифта и передает их в переменную playerdealy
            
    return 1;
     } 

    Эта функция возвращает кол-во тиков StartEndDelay.



     Устанавливает делитель очков.

    Устанавливает разделитель очков, так что вы не будете получать огромное количество очков в OnDirftUpdate и OnDriftEnd. по умолчанию 350.
     DriftSet_Divider
    PHP код:
    native DriftSet_Divider(divider,playerid = (-1)); 
     Пример

    PHP код:
    public OnFilterScriptInit ()
    {
        
    DriftSet_Divider (300);
        
    // Приведенный выше код будет установлен разделитель до 300 для всех игроков.
        
    DriftSet_Divider (300,88);
        
    // Приведенный выше код будет установлен разделитель до 300 для playerid 88
        
    return 1;


    Эта функция не возвращает никакого значения.

     DriftGet_Divider
    PHP код:
    native DriftGet_Divider(playerid = (0)); 
     Пример

    PHP код:
     public OnFilterScriptInit()
     {
            new 
    divider DriftGet_Divider(0);
            
    //Приведенный выше код получит делитель очков дрифта у playerid 0
            
    return 1;
     } 

    Эта функция возвращает делитель очков дрифта.



     Проверка на изменение здоровья транспорта

    Проверка на изменение здоровья транспорта, если у транспортного средства изменилось(уменьшилось) здоровье,то дрифт заканчивается и вызывается OnDriftEnd. В MaxHealthLoose, можно задать максимальное количество hp которое при его достижении остановит набор дрифт очков.
     DriftSet_DamageCheck
    PHP код:
    native DriftSet_DamageCheck(enable 1,playerid = (-1),Float:MaxHealthLoose 0.0);//default = disabled (0), enabled = 1 
     Пример

    PHP код:
    public OnFilterScriptInit()
     {
         
    DriftSet_DamageCheck(1,-1,10.0);
         
    //Вышеприведенный код включает(1) проверку, для всех игроков т.к. 2 параметр -1,максимальный урон за удар равняется 10hp
         
    DriftSet_DamageCheck(0,-1,0.0);
         
    //Выключает(0) проверку,для всех игроков т.к. 2 параметр -1
         
    DriftSet_DamageCheck(1,12,0.0);
         
    //Вышеприведенный код включает(1) проверку, для playerid 12,максимальный урон за удар равняется 0hp (id 12 запрещенно повреждать авто при наборе дрифт очков)
          
    return 1;
     } 

    Эта функция не возвращает никакого значения.

     DriftGet_DamageCheck
    PHP код:
    native DriftGet_DamageCheck(playerid = (0),&Float:MaxHealthLoose 0); 
     Пример

    PHP код:
     public OnFilterScriptInit()
     {
            new 
    Float:MaxLoose;
            new 
    status DriftGet_DamageCheck(4,MaxLoose);
            
    //Вышеприведенный код получает допустимое значение потери hp во время набора дрифт очков у playerid 4
            
    return 1;
     } 

    Эта функция возвращает включенный статус,0/falce если выключен,1/true если включен.



     Проверка на то, находится-ли игрок в дрифте.

    Проверка на то, находится-ли игрок в дрифте.
    PHP код:
    native IsPlayerDrifting(playerid); 
     Пример

    PHP код:
     public OnPlayerUpdate(playerid)
     {
            if(
    IsPlayerDrifting(playerid) == 1)
            {
                
    printf("Игрок %d дрифтует!",playerid);
            }
            else
            {
                
    //Игрок не дрифтует!
            
    }
            return 
    1;
     } 

    Эта функция возвращает 1/true если дрифт начался или 0/false если дрифт окончен и паблик OnPlayerDriftEnd был вызван.


     Паблик вызывается при начале обновлении дрифта.

    Паблик вызывается при начале дрифта,удобно для вызова textdraw`ов.
    PHP код:
    forward OnPlayerDriftStart(playerid); 
     Пример

    PHP код:
    public OnPlayerDriftStart(playerid)
     {
            
    SendClientMessage(playerid,0xFFFFFFFF,"Вы начали дрифтовать!");
            return 
    1;
     } 

    Этот колбэк нечего не возвращает.


     Паблик обновления.

    Этот паблик вызывается по очень много раз на каждого игрока, если игрок дрифтует.
    value - это количество очков дрифта, накопленные за последний завершенный дрифт.
    combo - комбо дрифт(x2,x3...) увеличивается до тех пор, пока не сработает OnPlayerDriftEnd.
    flagid - это ближайший флаг в 10 метрах.
    distance - расстояние до ближайшей флага.
    speed - скорость в км/ч.
    PHP код:
    forward OnPlayerDriftUpdate(playerid,value,combo,flagid,Float:distance,Float:speed); 
     Пример

    PHP код:
     new string[128];
     public 
    OnPlayerDriftUpdate(playerid,value,combo,flagid,Float:distance,Float:speed)
     {
            
    format(string,128,"Drift! Points: %d, combo %d, flagid %d, distance %.2f, speed %.2f",value,combo,flagid,distance,speed);
            
    GameTextForPlayer(playerid,string,200,2);
            return 
    1;
     } 

    Этот колбэк нечего не возвращает.


     Паблик завершения дрифта.

    Паблик вызывается, когда время задержки дрифта кончается или когда изменяется(уменьшается) здоровье авто.

    PHP код:
    forward OnPlayerDriftEnd(playerid,value,combo,reason); 
     Пример

    PHP код:
    new string[128];
    public 
    OnPlayerDriftEnd(playerid,value,combo,reason)
    {
            if(
    reason == DRIFT_REASON_TIME_EXPIRE)
            {
                    
    format(string,128,"You ended your drift because you time has expired to resume it! Points: %d, combo %d",value,combo);//дрифт окончен т.к. тики закончили отсчет.
            
    }
            else
            if(
    reason == DRIFT_REASON_CAR_DAMAGED)
            {
                    
    format(string,128,"You ended your drift because you you damaged your car too much! Points: %d, combo %d",value,combo);//дрифт окончен т.к. повреждения машины за 1 удар превышены
            
    }
            else
            if(
    reason == DRIFT_REASON_PLAYER_EXIT_VEHICLE)
            {
                    
    format(string,128,"You ended your drift because you you exited your vehicle! Points: %d, combo %d",value,combo);//дрифт окончен т.к. игрок вышел из транспорта
            
    }
            else
            {
                    
    format(string,128,"What the hell did you do to end this drift ?! Points: %d, combo %d",value,combo);//прекращение дрифта по другим причинам,например смерть игрового персонажа.

            
    }
            
    GameTextForPlayer(playerid,string,200,2);
            return 
    1;


    Этот колбэк нечего не возвращает.


     Эта функция точнее, чем IsPlayerDrifting.

    Эта функция точнее, чем IsPlayerDrifting, функция на самом деле говорит вам о том,что автомобиль действительно (на момент вызова) дрифтует,а не сам игрок.
    PHP код:
    native IsPlayerDrifting_precise(playerid); 
     Пример

    PHP код:
     public OnPlayerUpdate(playerid)
     {
            if(
    IsPlayerDrifting(playerid) == 1)
            {
                if(
    IsPlayerDrifting_precise(playerid) == 1)
                {
                    
    printf("Игрок %d находится в дрифте и на самом деле дрифтует!",playerid);
                }
                else
                {
                    
    printf("Игрок %d находится в дрифте но не дрифтует!",playerid);
                }
            }
            else
            {
                
    //Игрок не в дрифте
            
    }
            return 
    1;
     } 

    Эта функция возвращает 1/true если игрок дрифтует и 0/false если нет.


     Бонусные зоны дрифта.

     Добавляет бонусную зону.

    Добавляет зону в которой начисляются бонусные очки за дрифт.
    PHP код:
    native Drift_AddFLAG(Float:X,Float:Y,Float:Z); 
     Пример

    PHP код:
     public OnFilterScriptInit()
     {
            new 
    MyFlag Drift_AddFLAG(462.283,2576.455,953.235);
            return 
    1;
     } 

    Эта функция возвращает flagid.

     Отключает бонусную зону.

    Отключает Drift Checkpoint.
    PHP код:
    native Drift_DisableFLAG(flagid); 
     Пример

    PHP код:
     public OnFilterScriptInit()
    {
        new 
    MyFlag Drift_AddFLAG(462.283,2576.455,953.235);
        
    Drift_DisableFLAG(MyFlag);
        return 
    1;


    Эта функция не возвращает никакого значения.

     Удаляет бонусную зону.

    Удаляет бонусную зону(если не была создана новая бонусная зона,то это действие может быть отменено функцией EnableFLAG(flagid)).
    PHP код:
    native Drift_DeleteFLAG(flagid); 
     Пример

    PHP код:
    public OnFilterScriptInit()
    {
        new 
    MyFlag Drift_AddFLAG(462.283,2576.455,953.235);
        
    Drift_DeleteFLAG(MyFlag);//удаляет зону
        
    Drift_EnableFLAG(MyFlag);//Восстанавливает ее.
        
    return 1;


    Эта функция не возвращает никакого значения.

     Включает бонусную зону.

    Включает выключенную(или удаленную) бонусную зону.
    PHP код:
    native Drift_EnableFLAG(flagid); 
     Пример

    PHP код:
    public OnFilterScriptInit()
    {
        new 
    MyFlag Drift_AddFLAG(462.283,2576.455,953.235);//создает зону.
        
    Drift_DisableFLAG(MyFlag);//выключает зону.
        
    Drift_EnableFLAG(MyFlag);//включает зону.
        
    return 1;


    Эта функция не возвращает никакого значения.

     Задает бонусной зоне новую позицию.

    Задает бонусной зоне новую позицию.
    PHP код:
    native Drift_MoveFLAG(flagid,Float:X,Float:Y,Float:Z); 
     Пример

    PHP код:
    public OnFilterScriptInit()
    {
         new 
    MyFlag Drift_AddFLAG(462.283,2576.455,953.235);//создаем зону
         
    Drift_MoveFLAG(MyFlag,765.353,9876.343,12.34586);//присваиваем зоне новую позицию
         
    return 1;


    Эта функция не возвращает никакого значения.

     Включает/Отключает получение настроек для проверки бонусной зоны.

    Включает/Отключает получение настроек для проверки,если игрок(или указанный игрок) в диапазоне бонусной зоны.
     Drift_SetCheckForFlags
    PHP код:
    native Drift_SetCheckForFlags(enabled 1,playerid =(-1)); 
     Пример

    PHP код:
     public OnFilterScriptInit()
     {
         
    Drift_SetCheckForFlags(true,-1);//Включает проверку для всех игроков
         
    Drift_SetCheckForFlags(false,22);//Выключает проверку для playerid 22
         
    return 1;
     } 

    Эта функция не возвращает никакого значения

     Drift_GetCheckForFlags

    PHP код:
    native Drift_GetCheckForFlags(playerid 0); 
     Пример

    PHP код:
     public OnFilterScriptInit()
     {
         new 
    status Drift_GetCheckForFlags(2);
         
    //Код получает статус проверки playerid 2 и передает данные в переменную status
         
    return 1;
     } 

    Эта функция возвращает статус проверки (true-включена,false-выключена)



     Не рекомендуемый к использованию native.

    Этот native используется внутри плагина для получения вектора игроков,не рекомендуется использовать это, если вы не знаете, что вы делаете!
    PHP код:
    native Drift_Private_ChangeState(playerid,newstate); 
    Эта функция возвращает значения от -1 до 3 в зависимости от отказа/успеха.


     Включает/Отключает плагин.

    Включает/Отключает весь плагин,может быть использовано в любое время.
     Drift_SetGlobalCheck
    PHP код:
    native Drift_SetGlobalCheck(enable 1); 
     Пример

    PHP код:
    public OnFilterScriptInit()
    {
         
    Drift_SetGlobalCheck(true);//Код включает плагин
         
    Drift_SetGlobalCheck(false);//Код выключает плагин
         
    return 1;


    Эта функция не возвращает никакого значения.

     Drift_GetGlobalCheck
    PHP код:
    native Drift_GetGlobalCheck(); 
     Примемр

    PHP код:
    public OnFilterScriptInit()
    {
         if(
    Drift_SetGlobalCheck() == 0)//Если плагин выключен
         
    {
             
    Drift_SetGlobalCheck();//Включим плагин
         
    }
         return 
    1;


    Эта функция возвращает true если плагин включен,false если отключен.



     Включает/Отключает проверку, находится ли игрок в дрифте.

    Включает/Отключает проверку на то,находится-ли игрок в дрифте или нет.
    (Если поставить 0,то дрифт для указанного игрока будет отключен.)

     Drift_SetPlayerCheck
    PHP код:
    native Drift_SetPlayerCheck(playerid = (-1),enable 1); 
     Пример

    PHP код:
     public OnFilterScriptInit()
     {
         
    Drift_SetPlayerCheck(-1,true);//Включает проверку на всех игроков
         
    Drift_SetPlayerCheck(55,false);//Отключает проверку для playerid 55
         
    return 1;
     } 

    Эта функция не возвращает никакого значения

     Drift_GetPlayerCheck

    PHP код:
    native Drift_GetPlayerCheck(playerid = (0)); 
     Пример

    PHP код:
     public OnFilterScriptInit()
     {
         new 
    status Drift_GetPlayerCheck(4);
         
    //Код выше проверяет статус plyerid 4 на включенную или выключенную функцию проверки дрифта и записывает данные в переменную status.
         
    return 1;
     } 

    Эта функция возвращает статус, включен - 1, отключен - 0.



     Включает/Отключает возможность дрифта задним ходом.

    Включает/Отключает возможность дрифта задним ходом.
     Drift_SetBackwardsCheck
    PHP код:
    native Drift_SetBackwardsCheck(enabled 1,playerid =(-1)); 
     Пример

    PHP код:
    public OnFilterScriptInit()
    {
         
    Drift_SetBackwardsCheck(true,-1);//Отключает дрифт задним ходом для всех игроков
         
    Drift_SetBackwardsCheck(false,21);//Позволит playerid 21 дрифтовать задним ходом
         
    return 1;


    Эта функция не возвращает никакого значения


     Drift_GetBackwardsCheck
    PHP код:
    native Drift_GetBackwardsCheck(playerid 0); 
     Пример

    PHP код:
     public OnFilterScriptInit()
     {
         new 
    status Drift_GetBackwardsCheck(98);
         
    //Код получает статус проверки у playerid 98 (false-отключена,true-включена)
         
    return 1;
     } 

    Эта функция возвращает статус проверки.



     Смотрите раздел "DriftSet_DamageCheck" или "Проверка на изменение здоровья транспорта".

    Смотрите раздел "DriftSet_DamageCheck" или "Проверка на изменение здоровья транспорта".
     Drift_SetDriftMaxHealthLoose

    PHP код:
    native Drift_SetDriftMaxHealthLoose(Float:MaximalHealthLoose 0.0,playerid = (-1)); 
     Пример
    PHP код:
     public OnFilterScriptInit()
     {
         
    Drift_SetDriftMaxHealthLoose();
         
    //Приведенный выше код установит на всех игроков вызов паблика OnPlayerDriftEnd если транспортное средство будет повреждено.
         
    Drift_SetDriftMaxHealthLoose(20.0,44);
         
    //Приведенный выше код установит кол-во макс. здоровья,что транспортное средство может потерять за удар для playerid 44.
         
    return 1;
     } 

    Эта функция не возвращает никакого значения.

     Drift_GetDriftMaxHealthLoose

    PHP код:
    native Drift_GetDriftMaxHealthLoose(&Float:MaximalHealthLoose,playerid = (0)); 
     Пример

    PHP код:
    public OnFilterScriptInit()
     {
            new 
    Float:MaxLoose;
            
    Drift_GetDriftMaxHealthLoose(MaxLoose,35);
            
    //Код выше получает количество максимального здоровья, что транспортное средство может потерять за удар.
         
    return 1;
     } 

    Возвращает: This function returns the status, enabled - 1 (backwars drifting not allowed), disabled - 0 (backwards drifting allowed)




     Разработчики

    Gamer_Z
    Pghpunkid
    Incognito
    Kyosaur
    RyDeR`
    Zeex
    Rock_Ro
    Nero_3D

    Kyosaur
    RyDeR`



     Оф. тема


     Ссылки

     Плагин,инклуды,исходники,пробный ФС

     Работы и т.п. by Gamer_Z

     Wiki по плагину (Англ.)



    Перевод,дополнение статьи:[ForD]

    Специально для:Pro-Pawn.Ru


    Копирование данной статьи без разрешения автора запрещено!
    by Salvacore
    Последний раз редактировалось [ForD]; 25.12.2016 в 14:05. Причина: UPDATE
    PAWN Compiler делает то, что вы приказали ему сделать, а не то, что вы хотели, чтобы он сделал..

    25% времени в программировании уходит на размышления о том, что пользователь может сделать не так.[HR]/Брайан Хьюмс/





    #FIXSAMP

  2. 5 пользователя(ей) сказали cпасибо:
    $continue$ (14.07.2015)DeimoS (27.05.2014)Londlem (28.05.2014)Osetin (27.05.2014)untonyst (16.03.2015)
  3. #2
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    3,863
    Репутация:
    1483 ±
    Между спойлерами поставь пару пробелов. На тёмном стиле глаза просто просят остановить планету и сходят с неё. Сливается всё
    Связаться со мной можно в личных сообщениях этой группы

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  4. #3
    Аватар для [ForD]
    Пользователь

    Статус
    Оффлайн
    Регистрация
    14.11.2013
    Адрес
    Свердловская обл.
    Сообщений
    702
    Репутация:
    104 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Между спойлерами поставь пару пробелов. На тёмном стиле глаза просто просят остановить планету и сходят с неё. Сливается всё
    Учту,доделаю позже..
    PAWN Compiler делает то, что вы приказали ему сделать, а не то, что вы хотели, чтобы он сделал..

    25% времени в программировании уходит на размышления о том, что пользователь может сделать не так.[HR]/Брайан Хьюмс/





    #FIXSAMP

  5. #4
    Аватар для $continue$
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,435
    Репутация:
    261 ±
    Не плохо.

  6. Пользователь сказал cпасибо:
    [ForD] (14.07.2015)
  7. #5
    Аватар для Иван Бубнов
    Пользователь

    Статус
    Оффлайн
    Регистрация
    22.12.2015
    Сообщений
    162
    Репутация:
    8 ±
    Обновите плагин для 0.3.7 R2!

  8. #6
    Аватар для [ForD]
    Пользователь

    Статус
    Оффлайн
    Регистрация
    14.11.2013
    Адрес
    Свердловская обл.
    Сообщений
    702
    Репутация:
    104 ±
    Цитата Сообщение от Иван Бубнов Посмотреть сообщение
    Обновите плагин для 0.3.7 R2!
    Есть спойлер "Оф. тема" ,если у вас есть вопросы по плагину, то думаю их стоит задать именно там.

    Ссылки не надо обновлять,ссылка хоть и прямая,но она оригинальная прямо с репозитория "Gamer_Z" .

    В спойлере "Ссылки" есть еще спойлеры,выберите 2 пожалуйста, найдите там название данного плагина.

    P.S. Использую данный плагин, который скачан по ссылке указанной в теме,проблем нет.
    Последний раз редактировалось [ForD]; 17.03.2016 в 22:50. Причина: Ответ на трезвую голову)
    PAWN Compiler делает то, что вы приказали ему сделать, а не то, что вы хотели, чтобы он сделал..

    25% времени в программировании уходит на размышления о том, что пользователь может сделать не так.[HR]/Брайан Хьюмс/





    #FIXSAMP

  9. #7
    Аватар для vovandolg
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,353
    Репутация:
    113 ±
    Цитата Сообщение от [ForD] Посмотреть сообщение
    P.S. Использую данный плагин, который скачан по ссылке указанной в теме,проблем нет.
    Плагин установлен, компилировал с его же инклудом, sampgdk в папке с сервом лежит, запускаю на винде, ошибок нету, паблики дрифта не вызываются, точно проблем нет?
    Быдлокод не мой, но он рабочий по идее, я его просто с фс в гм преобразовал...
      Открыть/закрыть
    PHP код:
    //NFS Underground 2 Drift Counter for SA-MP by Gamer_Z
    //The includes
    #include <a_samp>
    #include <DriftPointsCounter>

    main(){}

    #define MAX_NITRO (700)
    #define POINTS_TO_GET_ONE_NITRO (600)
    //Variables for the textdraws
    new Text:Textdraw0[MAX_PLAYERS];
    new 
    Text:Textdraw1[MAX_PLAYERS];
    new 
    Text:Textdraw2[MAX_PLAYERS];
    new 
    Text:Textdraw3[MAX_PLAYERS];
    new 
    Text:Textdraw4[MAX_PLAYERS];
    new 
    Text:Textdraw5[MAX_PLAYERS];
    new 
    Text:Textdraw6[MAX_PLAYERS];
    new 
    Text:Textdraw7[MAX_PLAYERS];
    new 
    Text:Textdraw8[MAX_PLAYERS];
    new 
    Text:Textdraw9[MAX_PLAYERS];

    //global string variable
    new
        
    s[255];

    //drifting enumerator
    enum DriftingInfo
    {
        
    Best,
        
    Score,
        
    Combo,
        
    bool:using,
        
    NitroLeft
    }

    #define PRESSED(%0) \
        
    (((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))
    //the drifting variables for best score, score and combo
    new Drift_VAR[MAX_PLAYERS][DriftingInfo];

    //define our variable which will temporary hold our points number and a Timer variable for remembering which Timer we set
    new CurrPoints[MAX_PLAYERS];
    new 
    Timer[MAX_PLAYERS] = { -1, ...};

    public 
    OnPlayerConnect(playerid)
    {
        
    ResetAll(playerid);
        return 
    1;
    }

    public 
    OnPlayerDisconnect(playerid,reason)
    {
        
    ResetAll(playerid);
        return 
    1;
    }

    stock ResetAll(playerid)//make our reset code in case you need it
    {
        
    TextDrawHideForPlayer(playeridTextdraw0[playerid]);
        
    TextDrawHideForPlayer(playeridTextdraw1[playerid]);
        
    TextDrawHideForPlayer(playeridTextdraw2[playerid]);
        
    TextDrawHideForPlayer(playeridTextdraw3[playerid]);

        
    TextDrawHideForPlayer(playeridTextdraw4[playerid]);
        
    TextDrawHideForPlayer(playeridTextdraw5[playerid]);
        
    TextDrawHideForPlayer(playeridTextdraw6[playerid]);

        
    TextDrawHideForPlayer(playeridTextdraw7[playerid]);
        
        
    TextDrawHideForPlayer(playeridTextdraw8[playerid]);
        
    TextDrawHideForPlayer(playeridTextdraw9[playerid]);
        
        if(
    Timer[playerid] != -1)KillTimer(Timer[playerid]);
        
    Timer[playerid] = -1;
        
    Drift_VAR[playerid][using] = false;
        
    Drift_VAR[playerid][NitroLeft] = 0;
        
    Drift_VAR[playerid][Best] = Drift_VAR[playerid][Score] = CurrPoints[playerid] = 0;
        return 
    1;
    }

    public 
    OnGameModeInit()//OnFilterScriptInit
    {
        
    //create the textdraws
        
    AddPlayerClass(01958.37831343.157215.3746269.1425000000);
        for(new 
    playerid 0playerid GetMaxPlayers()-1/*MAX_PLAYERS*/; ++playerid)//F*ck the limit...
        
    {
            
    Textdraw0[playerid] = TextDrawCreate(20.000000131.000000"_~N~_~N~_~N~_~N~_~N~_~N~_~N~_~N~_~N~_~N~_");
            
    TextDrawBackgroundColor(Textdraw0[playerid], 255);
            
    TextDrawFont(Textdraw0[playerid], 1);
            
    TextDrawLetterSize(Textdraw0[playerid], 0.5000000.699998);
            
    TextDrawColor(Textdraw0[playerid], -1);
            
    TextDrawSetOutline(Textdraw0[playerid], 0);
            
    TextDrawSetProportional(Textdraw0[playerid], 1);
            
    TextDrawSetShadow(Textdraw0[playerid], 1);
            
    TextDrawUseBox(Textdraw0[playerid], 1);
            
    TextDrawBoxColor(Textdraw0[playerid], 119);
            
    TextDrawTextSize(Textdraw0[playerid], 151.0000000.000000);

            
    Textdraw1[playerid] = TextDrawCreate(19.000000132.000000"Best:~Y~1000000~N~~N~~N~~N~~W~Score:~R~1000000");
            
    TextDrawBackgroundColor(Textdraw1[playerid], 369098796);
            
    TextDrawFont(Textdraw1[playerid], 2);
            
    TextDrawLetterSize(Textdraw1[playerid], 0.4000001.500000);
            
    TextDrawColor(Textdraw1[playerid], -1);
            
    TextDrawSetOutline(Textdraw1[playerid], 1);
            
    TextDrawSetProportional(Textdraw1[playerid], 1);

            
    Textdraw2[playerid] = TextDrawCreate(19.000000149.000000"~g~X1");
            
    TextDrawBackgroundColor(Textdraw2[playerid], 369098796);
            
    TextDrawFont(Textdraw2[playerid], 2);
            
    TextDrawLetterSize(Textdraw2[playerid], 0.6000003.399998);
            
    TextDrawColor(Textdraw2[playerid], -1);
            
    TextDrawSetOutline(Textdraw2[playerid], 1);
            
    TextDrawSetProportional(Textdraw2[playerid], 1);

            
    Textdraw3[playerid] = TextDrawCreate(62.000000155.000000"Gain ~G~X2~W~ with:~N~_______350");
            
    TextDrawBackgroundColor(Textdraw3[playerid], 369098796);
            
    TextDrawFont(Textdraw3[playerid], 2);
            
    TextDrawLetterSize(Textdraw3[playerid], 0.3000001.100000);
            
    TextDrawColor(Textdraw3[playerid], -1);
            
    TextDrawSetOutline(Textdraw3[playerid], 1);
            
    TextDrawSetProportional(Textdraw3[playerid], 1);

            
    Textdraw4[playerid] = TextDrawCreate(640.000000412.000000"~N~");
            
    TextDrawBackgroundColor(Textdraw4[playerid], 255);
            
    TextDrawFont(Textdraw4[playerid], 1);
            
    TextDrawLetterSize(Textdraw4[playerid], 0.5199991.899999);
            
    TextDrawColor(Textdraw4[playerid], -1);
            
    TextDrawSetOutline(Textdraw4[playerid], 0);
            
    TextDrawSetProportional(Textdraw4[playerid], 1);
            
    TextDrawSetShadow(Textdraw4[playerid], 1);
            
    TextDrawUseBox(Textdraw4[playerid], 1);
            
    TextDrawBoxColor(Textdraw4[playerid], 119);
            
    TextDrawTextSize(Textdraw4[playerid], 563.0000000.000000);

            
    Textdraw5[playerid] = TextDrawCreate(619.000000419.000000"o");
            
    TextDrawBackgroundColor(Textdraw5[playerid], 369098796);
            
    TextDrawFont(Textdraw5[playerid], 2);
            
    TextDrawLetterSize(Textdraw5[playerid], 0.3000000.699998);
            
    TextDrawColor(Textdraw5[playerid], -1);
            
    TextDrawSetOutline(Textdraw5[playerid], 1);
            
    TextDrawSetProportional(Textdraw5[playerid], 1);

            
    Textdraw6[playerid] = TextDrawCreate(567.000000408.000000"100 km/h~n~_____125");
            
    TextDrawBackgroundColor(Textdraw6[playerid], 369098796);
            
    TextDrawFont(Textdraw6[playerid], 2);
            
    TextDrawLetterSize(Textdraw6[playerid], 0.3499991.299996);
            
    TextDrawColor(Textdraw6[playerid], -1);
            
    TextDrawSetOutline(Textdraw6[playerid], 1);
            
    TextDrawSetProportional(Textdraw6[playerid], 1);

            
    Textdraw7[playerid] = TextDrawCreate(320.000000150.000000"1000000");
            
    TextDrawAlignment(Textdraw7[playerid], 2);
            
    TextDrawBackgroundColor(Textdraw7[playerid], 369098796);
            
    TextDrawFont(Textdraw7[playerid], 3);
            
    TextDrawLetterSize(Textdraw7[playerid], 0.4499991.500000);
            
    TextDrawColor(Textdraw7[playerid], 0xF9FF8FEE);
            
    TextDrawSetOutline(Textdraw7[playerid], 1);
            
    TextDrawSetProportional(Textdraw7[playerid], 1);
            
    //
            
    Textdraw8[playerid] = TextDrawCreate(601.000000399.000000"N2O");
            
    TextDrawAlignment(Textdraw8[playerid], 2);
            
    TextDrawBackgroundColor(Textdraw8[playerid], 255);
            
    TextDrawFont(Textdraw8[playerid], 1);
            
    TextDrawLetterSize(Textdraw8[playerid], 0.2500000.599998);
            
    TextDrawColor(Textdraw8[playerid], -1);
            
    TextDrawSetOutline(Textdraw8[playerid], 0);
            
    TextDrawSetProportional(Textdraw8[playerid], 1);
            
    TextDrawSetShadow(Textdraw8[playerid], 1);
            
    TextDrawUseBox(Textdraw8[playerid], 1);
            
    TextDrawBoxColor(Textdraw8[playerid], 255);
            
    TextDrawTextSize(Textdraw8[playerid], 527.00000063.000000);

            
    Textdraw9[playerid] = TextDrawCreate(570.000000396.000000"////////////////////////////////////////////////////////////////////////////////////////////////////");
            
    TextDrawBackgroundColor(Textdraw9[playerid], 255);
            
    TextDrawFont(Textdraw9[playerid], 1);
            
    TextDrawLetterSize(Textdraw9[playerid], 0.0399990.999998);
            
    TextDrawColor(Textdraw9[playerid], 0xFFFF00AA);
            
    TextDrawSetOutline(Textdraw9[playerid], 0);
            
    TextDrawSetProportional(Textdraw9[playerid], 1);
            
    TextDrawSetShadow(Textdraw9[playerid], 1);
        }
        
    Drift_SetGlobalCheck(true);
        
    //configure the DriftingPointsCounter plugin
        
    DriftSet_DamageCheck();//enable damage checking
        
    DriftSet_UpdateDelay(8);//set the each plugin loop to 8 sa-mp ticks (5 ms sleep + tick time of sa-mp for executing it's loops etc and other plugins)
        
    DriftSet_Divider(3000);//the points divider so our players won't get superb high score, how bigger the divider , the less score they get
        
    DriftSet_StartEndDelay(30);//the counter in ticks (UpdateDelay*30 sa-mp ticks) which will say when a player is not drifting anymore
        
    DriftSet_MinimalAngle(15.5);//minimal angle to start a drift
         
    DriftSet_MinimalSpeed(25.5);//minimal speed ""
        
    AddStaticVehicle(4700.00.011.0180.123100);
        return 
    1;
    }

    public 
    OnGameModeExit()//OnFilterScriptExit
    {
        for(new 
    playerid 0playerid GetMaxPlayers()-1; ++playerid)
        {
            if(
    Timer[playerid] != (-1))KillTimer(Timer[playerid]);
            
    TextDrawHideForPlayer(playeridTextdraw0[playerid]);
            
    TextDrawHideForPlayer(playeridTextdraw1[playerid]);
            
    TextDrawHideForPlayer(playeridTextdraw2[playerid]);
            
    TextDrawHideForPlayer(playeridTextdraw3[playerid]);

            
    TextDrawHideForPlayer(playeridTextdraw4[playerid]);
            
    TextDrawHideForPlayer(playeridTextdraw5[playerid]);
            
    TextDrawHideForPlayer(playeridTextdraw6[playerid]);

            
    TextDrawHideForPlayer(playeridTextdraw7[playerid]);
            
            
    TextDrawHideForPlayer(playeridTextdraw8[playerid]);
            
    TextDrawHideForPlayer(playeridTextdraw9[playerid]);
            
            
    TextDrawDestroy(Textdraw0[playerid]);
            
    TextDrawDestroy(Textdraw1[playerid]);
            
    TextDrawDestroy(Textdraw2[playerid]);
            
    TextDrawDestroy(Textdraw3[playerid]);
            
    TextDrawDestroy(Textdraw4[playerid]);
            
    TextDrawDestroy(Textdraw5[playerid]);
            
    TextDrawDestroy(Textdraw6[playerid]);
            
    TextDrawDestroy(Textdraw7[playerid]);
            
    TextDrawDestroy(Textdraw8[playerid]);
            
    TextDrawDestroy(Textdraw9[playerid]);
        }
        return 
    1;
    }

    public 
    OnPlayerKeyStateChange(playeridnewkeysoldkeys)
    {
        if(
    GetPlayerState(playerid) == PLAYER_STATE_DRIVER)//player is driver
        
    {
            new 
    Car GetPlayerVehicleID(playerid), Model GetVehicleModel(Car);//get the VehicleID and Model
            
    switch(Model)//check model for allowed type to add nitro, if not allowed return 0;
            
    {
                case 
    446,432,448,452,424,453,454,461,462,463,468,471,430,472,449,473,481,484,493,495,509,510,521,538,522,523,532,537,570,581,586,590,569,595,604,611: return 0;
            }
            if((
    PRESSED(KEY_FIRE) || PRESSED(KEY_ACTION))//is player holding key_fire OR key_action?
            
    && Drift_VAR[playerid][NitroLeft] > 0)//and his nitro is greater than 0?
            
    {
                
    Drift_VAR[playerid][using] = true;//then the player is using nitro
                
    AddVehicleComponent(Car1010);//so we add the component to his vehicle
            
    }
            else
            {
                
    Drift_VAR[playerid][using] = false;//player is not using nitro
                
    RemoveVehicleComponent(Car,1010);//so we remove the component
            
    }
        }
        return 
    1;
    }

    //our callback which gets called when the player starts drifting
    public OnPlayerDriftStart(playerid)
    {
        print(
    "OnPlayerDriftStart1");
        if(
    Timer[playerid] != (-1))KillTimer(Timer[playerid]);//check if we already created a timer, if yes - destroy it
        
    CurrPoints[playerid] = 0;//set the current drift points to 0

         //show the textdraw for counting current drift points and set it's text to "0"
        
    TextDrawShowForPlayer(playeridTextdraw7[playerid]);
        
    TextDrawSetString(Textdraw7[playerid],"0");
        
        
    //do some combo (X's) checks and set the according information, like in NFSUG2
        
    if(Drift_VAR[playerid][Combo] == 1)//got x1
        
    {
            
    TextDrawSetString(Textdraw2[playerid],"~G~X1");
            
    TextDrawSetString(Textdraw3[playerid],"Gain ~G~X2~W~ with:~N~_______350");
        }else if(
    Drift_VAR[playerid][Combo] == 2)//got x2
        
    {
            
    TextDrawSetString(Textdraw2[playerid],"~G~X2");
            
    TextDrawSetString(Textdraw3[playerid],"Gain ~G~X3~W~ with:~N~_______1400");
        }else if(
    Drift_VAR[playerid][Combo] == 3)//got x3
        
    {
            
    TextDrawSetString(Textdraw2[playerid],"~G~X3");
            
    TextDrawSetString(Textdraw3[playerid],"Gain ~G~X4~W~ with:~N~_______4200");
        }else if(
    Drift_VAR[playerid][Combo] == 4)//got x4
        
    {
            
    TextDrawSetString(Textdraw2[playerid],"~G~X4");
            
    TextDrawSetString(Textdraw3[playerid],"Gain ~G~X5~W~ with:~N~_______11500");
        }else
    //got x5
        
    {
            
    TextDrawSetString(Textdraw2[playerid],"~G~X5");
            
    TextDrawSetString(Textdraw3[playerid],"____ ~G~MAX~W~ ~N~_______---");
        }
        return 
    1;
    }

    //our callback which gets called when the player is drifting AFTER OnPlayerDriftStart is called.
    public OnPlayerDriftUpdate(playerid,value,combo,flagid,Float:distance,Float:speed)
    {
        print(
    "OnPlayerDriftUpdate");
        
    CurrPoints[playerid]+=(value*Drift_VAR[playerid][Combo]);//append to the current drift points our drifting score

        //again some X's checks
        
    if(CurrPoints[playerid] < 350)//get x1
        
    {
            if(
    Drift_VAR[playerid][Combo] < 2)//check if the player hasn't a higher combo yet
            
    {
                
    Drift_VAR[playerid][Combo] = 1;
                
    TextDrawSetString(Textdraw2[playerid],"~G~X1");
                
    TextDrawSetString(Textdraw3[playerid],"Gain ~G~X2~W~ with:~N~_______350");
            }
        }
        else if(
    CurrPoints[playerid] < 1400)//get x2
        
    {
            if(
    Drift_VAR[playerid][Combo] < 3)
            {
                
    Drift_VAR[playerid][Combo] = 2;
                
    TextDrawSetString(Textdraw2[playerid],"~G~X2");
                
    TextDrawSetString(Textdraw3[playerid],"Gain ~G~X3~W~ with:~N~_______1400");
            }
        }
        else if(
    CurrPoints[playerid] < 4200)//get x3
        
    {
            if(
    Drift_VAR[playerid][Combo] < 4)
            {
                
    Drift_VAR[playerid][Combo] = 3;
                
    TextDrawSetString(Textdraw2[playerid],"~G~X3");
                
    TextDrawSetString(Textdraw3[playerid],"Gain ~G~X4~W~ with:~N~_______4200");
            }
        }
        else if(
    CurrPoints[playerid] < 11500)//get x4
        
    {
             if(
    Drift_VAR[playerid][Combo] < 5)
            {
                
    Drift_VAR[playerid][Combo] = 4;
                
    TextDrawSetString(Textdraw2[playerid],"~G~X4");
                
    TextDrawSetString(Textdraw3[playerid],"Gain ~G~X5~W~ with:~N~_______11500");
            }
        }
        else
    //get x5
        
    {
            
    Drift_VAR[playerid][Combo] = 5;
            
    TextDrawSetString(Textdraw2[playerid],"~G~X5");
            
    TextDrawSetString(Textdraw3[playerid],"____ ~G~MAX~W~ ~N~_______---");
        }
        
    //format and set the current drifting points
        
    format(s,255,"%d",CurrPoints[playerid]);
        
    TextDrawSetString(Textdraw7[playerid],s);
        
        
    //update our main scoreboard
        
    format(s,255,"Best:~Y~%d~N~~N~~N~~N~~W~Score:~R~%d",Drift_VAR[playerid][Best],Drift_VAR[playerid][Score]);
        
    TextDrawSetString(Textdraw1[playerid],s);
        
    printf("%d %d %d",CurrPoints[playerid],Drift_VAR[playerid][Best],Drift_VAR[playerid][Score]);
        return 
    1;
    }

    //this gets called after the player didn't start a drift in the required time, so his drift is ended
    public OnPlayerDriftEnd(playerid,value,combo,reason)
    {
        print(
    "OnPlayerDriftEnd");
        
    Drift_SetPlayerCheck(playerid,0);//we disable the player from the DriftingPointsCounter, this player cannot drift now, OnPlayerDriftStart won't be called
        
    if(reason != DRIFT_REASON_CAR_DAMAGED)//The car wasn't damaged, so the drift was succesful (however the player could jump out of the car...
        
    {
            if(
    CurrPoints[playerid] > Drift_VAR[playerid][Best])Drift_VAR[playerid][Best] = CurrPoints[playerid];//check if the player beat his best score, if yes set the temporary score to the best score
            
    Drift_VAR[playerid][Score]+=CurrPoints[playerid];//update our main score with our temporary score
            
    Drift_VAR[playerid][NitroLeft]+=floatround(CurrPoints[playerid]/POINTS_TO_GET_ONE_NITRO);//some nitro adding code
            
    if(Drift_VAR[playerid][NitroLeft] > MAX_NITRO)Drift_VAR[playerid][NitroLeft] = MAX_NITRO;//set a MAX on nitro value
            
    SetTimerEx("RestoreDrift",150,0,"d",playerid);//Set a timed public execution with the passed playerid parameter
        
    }
        else if(
    reason == DRIFT_REASON_CAR_DAMAGED)//OMG WTF NISIBNFIN$!!! THE CAR GOT DAMAGED OHWTF! BAN HIMWM!!!!
        
    {
            if(
    Timer[playerid] != (-1))KillTimer(Timer[playerid]);
            
    Drift_VAR[playerid][Combo] = 1;
            
    TextDrawSetString(Textdraw2[playerid],"~G~X1");
            
    TextDrawSetString(Textdraw3[playerid],"Gain ~G~X2~W~ with:~N~_______350");
            
    Timer[playerid] = -1;
            
    format(s,255,"~r~%d",CurrPoints[playerid]);//make our textdraw red with ~r~
            
    TextDrawSetString(Textdraw7[playerid],s);//update the textdraw
            
    SetTimerEx("RestoreDrift",1250,0,"d",playerid);//we won't hide the textdraw now, just let the player see the red buhahaha, he deserves it.
        
    }
        
        
    CurrPoints[playerid] = 0;//set the temporary points (again) to 0, so the next drift will have a 'fresh start'
        
        
    if(Timer[playerid] != (-1))KillTimer(Timer[playerid]);//again our timer thingy...
        
    if(Drift_VAR[playerid][Combo] == 1)//got x1
        
    {
            
    TextDrawSetString(Textdraw2[playerid],"~G~X1");
            
    TextDrawSetString(Textdraw3[playerid],"Gain ~G~X2~W~ with:~N~_______350");
            
    Timer[playerid] = -1;
        }else if(
    Drift_VAR[playerid][Combo] == 2)//got x2
        
    {
            
    TextDrawSetString(Textdraw2[playerid],"~G~X2");
            
    TextDrawSetString(Textdraw3[playerid],"Gain ~G~X3~W~ with:~N~_______1400");

            
    //
            
    Timer[playerid] = SetTimerEx("DecreaseX",5000,0,"d",playerid);
            
    //if the player doesn't start a drift within 5 secs,
            //the timer won't get killed so this public will get called,
            //same apply for all other lines below
        
    }else if(Drift_VAR[playerid][Combo] == 3)//got x3
        
    {
            
    TextDrawSetString(Textdraw2[playerid],"~G~X3");
            
    TextDrawSetString(Textdraw3[playerid],"Gain ~G~X4~W~ with:~N~_______4200");
            
    Timer[playerid] = SetTimerEx("DecreaseX",3500,0,"d",playerid);
        }else if(
    Drift_VAR[playerid][Combo] == 4)//got x4
        
    {
            
    TextDrawSetString(Textdraw2[playerid],"~G~X4");
            
    TextDrawSetString(Textdraw3[playerid],"Gain ~G~X5~W~ with:~N~_______11500");
            
    Timer[playerid] = SetTimerEx("DecreaseX",2500,0,"d",playerid);
        }else
    //got x5
        
    {
            
    TextDrawSetString(Textdraw2[playerid],"~G~X5");
            
    TextDrawSetString(Textdraw3[playerid],"____ ~G~MAX~W~ ~N~_______---");
            
    Timer[playerid] = SetTimerEx("DecreaseX",1000,0,"d",playerid);
        }
        
    //update our main scoreboard again
        
    format(s,255,"Best:~Y~%d~N~~N~~N~~N~~W~Score:~R~%d",Drift_VAR[playerid][Best],Drift_VAR[playerid][Score]);
        
    TextDrawSetString(Textdraw1[playerid],s);
        return 
    1;
    }

    //here is our little magic to enable the drifting again
    forward RestoreDrift(playerid);
    public 
    RestoreDrift(playerid)
    {
        
    Drift_SetPlayerCheck(playerid,1);//enable the player in the plugin
        
    TextDrawHideForPlayer(playeridTextdraw7[playerid]);//hide the temporary score textdraw, no more red or normal score
        
    return 1;
    }

    //here is our X's decrease code.. we won't give the player unlimited X's, he has to use them in time!
    forward DecreaseX(playerid);
    public 
    DecreaseX(playerid)
    {
        
    Drift_VAR[playerid][Combo]-=1;
        if(
    Drift_VAR[playerid][Combo] < 1)Drift_VAR[playerid][Combo] = 1;//prevention...
        
    if(Timer[playerid] != (-1))KillTimer(Timer[playerid]);//you've seen this before my mate...
        
        //now our X's decrease code
        
    if(Drift_VAR[playerid][Combo] == 1)//got x1
        
    {
            
    TextDrawSetString(Textdraw2[playerid],"~G~X1");
            
    TextDrawSetString(Textdraw3[playerid],"Gain ~G~X2~W~ with:~N~_______350");
            
    Timer[playerid] = -1;
        }else if(
    Drift_VAR[playerid][Combo] == 2)//got x2
        
    {
            
    //so the player had X3, now he will have X2....
            //poor player didn't make it in time,
            //anyway he still has X2, so let's give him 5 seconds to re-drift and get him some points!
            //same apples for lines below
            
    TextDrawSetString(Textdraw2[playerid],"~G~X2");
            
    TextDrawSetString(Textdraw3[playerid],"Gain ~G~X3~W~ with:~N~_______1400");
            
    Timer[playerid] = SetTimerEx("DecreaseX",5000,0,"d",playerid);//call this callback again
        
    }else if(Drift_VAR[playerid][Combo] == 3)//got x3
        
    {
            
    TextDrawSetString(Textdraw2[playerid],"~G~X3");
            
    TextDrawSetString(Textdraw3[playerid],"Gain ~G~X4~W~ with:~N~_______4200");
            
    Timer[playerid] = SetTimerEx("DecreaseX",3500,0,"d",playerid);
        }else if(
    Drift_VAR[playerid][Combo] == 4)//got x4
        
    {
            
    TextDrawSetString(Textdraw2[playerid],"~G~X4");
            
    TextDrawSetString(Textdraw3[playerid],"Gain ~G~X5~W~ with:~N~_______11500");
            
    Timer[playerid] = SetTimerEx("DecreaseX",2500,0,"d",playerid);
        }else
    //got x5
        
    {
            
    TextDrawSetString(Textdraw2[playerid],"~G~X5");
            
    TextDrawSetString(Textdraw3[playerid],"____ ~G~MAX~W~ ~N~_______---");
            
    Timer[playerid] = SetTimerEx("DecreaseX",1000,0,"d",playerid);
        }
        return 
    1;
    }

    //variable for holding float data
    new Float:fvar[8];
    public 
    OnPlayerUpdate(playerid)//our little friend, which can lag us.
    {
        if(!
    IsPlayerInAnyVehicle(playerid))return 1;//player is not in a vehicle
        
    if(Drift_VAR[playerid][using] == true)//if player is using nitro
            
    Drift_VAR[playerid][NitroLeft]--;//decrease his amount of nitro by 1
        
    new vehid GetPlayerVehicleID(playerid);//get the players vehicleid
        
    GetVehicleVelocity(vehid,fvar[0],fvar[1],fvar[2]);//get the players X speed, Y speed and Z speed
        
    GetVehicleZAngle(vehid,fvar[7]);//get the players vehicle Z angle
        
    if(Drift_VAR[playerid][NitroLeft] < 0)//if nitro is below 0
        
    {
            
    Drift_VAR[playerid][NitroLeft] = 0;//set to 0
            
    Drift_VAR[playerid][using] = false;//player is not using it because...
            
    RemoveVehicleComponent(vehid,1010);//...we remove it
         
    }
         
         new 
    Float:Xtemp floatmul(floatdiv(Drift_VAR[playerid][NitroLeft],MAX_NITRO),100.0);
         new 
    AmountView floatround(Xtemp);

        
    s[0] = 0;
        for(new 
    0AmountView; ++i)
        {
            
    strins(s,"/",0);
        }
         
    TextDrawSetString(Textdraw9[playerid],s);

        new 
    Float:Angle RealDifference(fvar[7],GetVelocityHeading(fvar[0],fvar[1],fvar[7]));//now we calculate his difference between his heading and his angle
        
    new Float:Speed floatsqroot((fvar[0]*fvar[0])+(fvar[1]*fvar[1])+(fvar[2]*fvar[2]))*274.0;//calculate players speed
        
    format(s,255,"%.0f km/h~n~_____%.0f",Speed,Angle);//format our nice string and...
        
    TextDrawSetString(Textdraw6[playerid],s);//...update our speedo and driftmeter textdraw
        
    return 1;
    }

    public 
    OnPlayerStateChange(playeridnewstateoldstate)//yay, player does something, we actually need to monitor
    {
        if(
    oldstate == PLAYER_STATE_DRIVER)//the player was a driver so...
        
    {
        
    //hide all TD's
            
    TextDrawHideForPlayer(playeridTextdraw0[playerid]);
            
    TextDrawHideForPlayer(playeridTextdraw1[playerid]);
            
    TextDrawHideForPlayer(playeridTextdraw2[playerid]);
            
    TextDrawHideForPlayer(playeridTextdraw3[playerid]);

            
    TextDrawHideForPlayer(playeridTextdraw4[playerid]);
            
    TextDrawHideForPlayer(playeridTextdraw5[playerid]);
            
    TextDrawHideForPlayer(playeridTextdraw6[playerid]);
            
            
    TextDrawHideForPlayer(playeridTextdraw7[playerid]);
            
            
    TextDrawHideForPlayer(playeridTextdraw8[playerid]);
            
    TextDrawHideForPlayer(playeridTextdraw9[playerid]);
        }
        if(
    newstate == PLAYER_STATE_DRIVER)//and the players new state is a driver (also?) so
        
    {
        
    //we show the TD's and do a little scoreboard update
            
    TextDrawShowForPlayer(playeridTextdraw0[playerid]);
            
    TextDrawShowForPlayer(playeridTextdraw1[playerid]);
            
    TextDrawShowForPlayer(playeridTextdraw2[playerid]);
            
    TextDrawShowForPlayer(playeridTextdraw3[playerid]);
            
            
    TextDrawShowForPlayer(playeridTextdraw4[playerid]);
            
    TextDrawShowForPlayer(playeridTextdraw5[playerid]);
            
    TextDrawShowForPlayer(playeridTextdraw6[playerid]);

            
    TextDrawShowForPlayer(playeridTextdraw8[playerid]);
            
    TextDrawShowForPlayer(playeridTextdraw9[playerid]);

            
    format(s,255,"Best:~Y~%d~N~~N~~N~~N~~W~Score:~R~%d",Drift_VAR[playerid][Best],Drift_VAR[playerid][Score]);
            
    TextDrawSetString(Textdraw1[playerid],s);
            
    TextDrawSetString(Textdraw3[playerid],"Gain ~G~X2~W~ with:~N~_______350");
            
    TextDrawSetString(Textdraw2[playerid],"~G~X1");
        }
        return 
    1;
    }

    //calculation functions.. maths etc
    forward Float:RealDifference(Float:A,Float:H);
    stock Float:RealDifference(Float:A,Float:H)//Get smallest difference
    {
        new 
    Float:diff H-A;
        if(
    diff < -180.0)diff+=360.0;
        if(
    diff 180.0)diff-=360.0;
        return 
    floatabs(diff);
    }

    forward Float:GetVelocityHeading(Float:Vx,Float:Vy,Float:VZA);
    stock Float:GetVelocityHeading(Float:Vx,Float:Vy,Float:VZA)//Get heading angle
    {
        if(
    Vy == 0.0)
            
    Vy 0.0000000001;//prevent division by 0
        
    if(Vx Vy)
            return 
    0   atan(Vx/Vy);
        else if((
    Vx Vy) || (Vx Vy))
            return 
    180 atan(Vx/Vy);
        else if(
    Vx Vy)
            return 
    360 atan(Vx/Vy);
        else
            return 
    VZA;//we have no speed in X, so the players angle can't be determined, in this case we return the vehicle angle instead of the heading which can't be determined

    [Anticheat]___Invisible Fly Hack
    [Anticheat]____Weapon/Ammo Hack
    [Function]______ResetPlayerWeaponSlot
    [Function]_______FIX_SetPlayerAmmo
    [ServerMod]______TDM | Zombie Apokalypse

  10. #8
    Аватар для [ForD]
    Пользователь

    Статус
    Оффлайн
    Регистрация
    14.11.2013
    Адрес
    Свердловская обл.
    Сообщений
    702
    Репутация:
    104 ±
    Цитата Сообщение от vovandolg Посмотреть сообщение
    Плагин установлен, компилировал с его же инклудом, sampgdk в папке с сервом лежит, запускаю на винде, ошибок нету, паблики дрифта не вызываются, точно проблем нет?
    Быдлокод не мой, но он рабочий по идее, я его просто с фс в гм преобразовал...
      Открыть/закрыть
    PHP код:
    //NFS Underground 2 Drift Counter for SA-MP by Gamer_Z
    //The includes
    #include <a_samp>
    #include <DriftPointsCounter>

    main(){}

    #define MAX_NITRO (700)
    #define POINTS_TO_GET_ONE_NITRO (600)
    //Variables for the textdraws
    new Text:Textdraw0[MAX_PLAYERS];
    new 
    Text:Textdraw1[MAX_PLAYERS];
    new 
    Text:Textdraw2[MAX_PLAYERS];
    new 
    Text:Textdraw3[MAX_PLAYERS];
    new 
    Text:Textdraw4[MAX_PLAYERS];
    new 
    Text:Textdraw5[MAX_PLAYERS];
    new 
    Text:Textdraw6[MAX_PLAYERS];
    new 
    Text:Textdraw7[MAX_PLAYERS];
    new 
    Text:Textdraw8[MAX_PLAYERS];
    new 
    Text:Textdraw9[MAX_PLAYERS];

    //global string variable
    new
        
    s[255];

    //drifting enumerator
    enum DriftingInfo
    {
        
    Best,
        
    Score,
        
    Combo,
        
    bool:using,
        
    NitroLeft
    }

    #define PRESSED(%0) \
        
    (((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))
    //the drifting variables for best score, score and combo
    new Drift_VAR[MAX_PLAYERS][DriftingInfo];

    //define our variable which will temporary hold our points number and a Timer variable for remembering which Timer we set
    new CurrPoints[MAX_PLAYERS];
    new 
    Timer[MAX_PLAYERS] = { -1, ...};

    public 
    OnPlayerConnect(playerid)
    {
        
    ResetAll(playerid);
        return 
    1;
    }

    public 
    OnPlayerDisconnect(playerid,reason)
    {
        
    ResetAll(playerid);
        return 
    1;
    }

    stock ResetAll(playerid)//make our reset code in case you need it
    {
        
    TextDrawHideForPlayer(playeridTextdraw0[playerid]);
        
    TextDrawHideForPlayer(playeridTextdraw1[playerid]);
        
    TextDrawHideForPlayer(playeridTextdraw2[playerid]);
        
    TextDrawHideForPlayer(playeridTextdraw3[playerid]);

        
    TextDrawHideForPlayer(playeridTextdraw4[playerid]);
        
    TextDrawHideForPlayer(playeridTextdraw5[playerid]);
        
    TextDrawHideForPlayer(playeridTextdraw6[playerid]);

        
    TextDrawHideForPlayer(playeridTextdraw7[playerid]);
        
        
    TextDrawHideForPlayer(playeridTextdraw8[playerid]);
        
    TextDrawHideForPlayer(playeridTextdraw9[playerid]);
        
        if(
    Timer[playerid] != -1)KillTimer(Timer[playerid]);
        
    Timer[playerid] = -1;
        
    Drift_VAR[playerid][using] = false;
        
    Drift_VAR[playerid][NitroLeft] = 0;
        
    Drift_VAR[playerid][Best] = Drift_VAR[playerid][Score] = CurrPoints[playerid] = 0;
        return 
    1;
    }

    public 
    OnGameModeInit()//OnFilterScriptInit
    {
        
    //create the textdraws
        
    AddPlayerClass(01958.37831343.157215.3746269.1425000000);
        for(new 
    playerid 0playerid GetMaxPlayers()-1/*MAX_PLAYERS*/; ++playerid)//F*ck the limit...
        
    {
            
    Textdraw0[playerid] = TextDrawCreate(20.000000131.000000"_~N~_~N~_~N~_~N~_~N~_~N~_~N~_~N~_~N~_~N~_");
            
    TextDrawBackgroundColor(Textdraw0[playerid], 255);
            
    TextDrawFont(Textdraw0[playerid], 1);
            
    TextDrawLetterSize(Textdraw0[playerid], 0.5000000.699998);
            
    TextDrawColor(Textdraw0[playerid], -1);
            
    TextDrawSetOutline(Textdraw0[playerid], 0);
            
    TextDrawSetProportional(Textdraw0[playerid], 1);
            
    TextDrawSetShadow(Textdraw0[playerid], 1);
            
    TextDrawUseBox(Textdraw0[playerid], 1);
            
    TextDrawBoxColor(Textdraw0[playerid], 119);
            
    TextDrawTextSize(Textdraw0[playerid], 151.0000000.000000);

            
    Textdraw1[playerid] = TextDrawCreate(19.000000132.000000"Best:~Y~1000000~N~~N~~N~~N~~W~Score:~R~1000000");
            
    TextDrawBackgroundColor(Textdraw1[playerid], 369098796);
            
    TextDrawFont(Textdraw1[playerid], 2);
            
    TextDrawLetterSize(Textdraw1[playerid], 0.4000001.500000);
            
    TextDrawColor(Textdraw1[playerid], -1);
            
    TextDrawSetOutline(Textdraw1[playerid], 1);
            
    TextDrawSetProportional(Textdraw1[playerid], 1);

            
    Textdraw2[playerid] = TextDrawCreate(19.000000149.000000"~g~X1");
            
    TextDrawBackgroundColor(Textdraw2[playerid], 369098796);
            
    TextDrawFont(Textdraw2[playerid], 2);
            
    TextDrawLetterSize(Textdraw2[playerid], 0.6000003.399998);
            
    TextDrawColor(Textdraw2[playerid], -1);
            
    TextDrawSetOutline(Textdraw2[playerid], 1);
            
    TextDrawSetProportional(Textdraw2[playerid], 1);

            
    Textdraw3[playerid] = TextDrawCreate(62.000000155.000000"Gain ~G~X2~W~ with:~N~_______350");
            
    TextDrawBackgroundColor(Textdraw3[playerid], 369098796);
            
    TextDrawFont(Textdraw3[playerid], 2);
            
    TextDrawLetterSize(Textdraw3[playerid], 0.3000001.100000);
            
    TextDrawColor(Textdraw3[playerid], -1);
            
    TextDrawSetOutline(Textdraw3[playerid], 1);
            
    TextDrawSetProportional(Textdraw3[playerid], 1);

            
    Textdraw4[playerid] = TextDrawCreate(640.000000412.000000"~N~");
            
    TextDrawBackgroundColor(Textdraw4[playerid], 255);
            
    TextDrawFont(Textdraw4[playerid], 1);
            
    TextDrawLetterSize(Textdraw4[playerid], 0.5199991.899999);
            
    TextDrawColor(Textdraw4[playerid], -1);
            
    TextDrawSetOutline(Textdraw4[playerid], 0);
            
    TextDrawSetProportional(Textdraw4[playerid], 1);
            
    TextDrawSetShadow(Textdraw4[playerid], 1);
            
    TextDrawUseBox(Textdraw4[playerid], 1);
            
    TextDrawBoxColor(Textdraw4[playerid], 119);
            
    TextDrawTextSize(Textdraw4[playerid], 563.0000000.000000);

            
    Textdraw5[playerid] = TextDrawCreate(619.000000419.000000"o");
            
    TextDrawBackgroundColor(Textdraw5[playerid], 369098796);
            
    TextDrawFont(Textdraw5[playerid], 2);
            
    TextDrawLetterSize(Textdraw5[playerid], 0.3000000.699998);
            
    TextDrawColor(Textdraw5[playerid], -1);
            
    TextDrawSetOutline(Textdraw5[playerid], 1);
            
    TextDrawSetProportional(Textdraw5[playerid], 1);

            
    Textdraw6[playerid] = TextDrawCreate(567.000000408.000000"100 km/h~n~_____125");
            
    TextDrawBackgroundColor(Textdraw6[playerid], 369098796);
            
    TextDrawFont(Textdraw6[playerid], 2);
            
    TextDrawLetterSize(Textdraw6[playerid], 0.3499991.299996);
            
    TextDrawColor(Textdraw6[playerid], -1);
            
    TextDrawSetOutline(Textdraw6[playerid], 1);
            
    TextDrawSetProportional(Textdraw6[playerid], 1);

            
    Textdraw7[playerid] = TextDrawCreate(320.000000150.000000"1000000");
            
    TextDrawAlignment(Textdraw7[playerid], 2);
            
    TextDrawBackgroundColor(Textdraw7[playerid], 369098796);
            
    TextDrawFont(Textdraw7[playerid], 3);
            
    TextDrawLetterSize(Textdraw7[playerid], 0.4499991.500000);
            
    TextDrawColor(Textdraw7[playerid], 0xF9FF8FEE);
            
    TextDrawSetOutline(Textdraw7[playerid], 1);
            
    TextDrawSetProportional(Textdraw7[playerid], 1);
            
    //
            
    Textdraw8[playerid] = TextDrawCreate(601.000000399.000000"N2O");
            
    TextDrawAlignment(Textdraw8[playerid], 2);
            
    TextDrawBackgroundColor(Textdraw8[playerid], 255);
            
    TextDrawFont(Textdraw8[playerid], 1);
            
    TextDrawLetterSize(Textdraw8[playerid], 0.2500000.599998);
            
    TextDrawColor(Textdraw8[playerid], -1);
            
    TextDrawSetOutline(Textdraw8[playerid], 0);
            
    TextDrawSetProportional(Textdraw8[playerid], 1);
            
    TextDrawSetShadow(Textdraw8[playerid], 1);
            
    TextDrawUseBox(Textdraw8[playerid], 1);
            
    TextDrawBoxColor(Textdraw8[playerid], 255);
            
    TextDrawTextSize(Textdraw8[playerid], 527.00000063.000000);

            
    Textdraw9[playerid] = TextDrawCreate(570.000000396.000000"////////////////////////////////////////////////////////////////////////////////////////////////////");
            
    TextDrawBackgroundColor(Textdraw9[playerid], 255);
            
    TextDrawFont(Textdraw9[playerid], 1);
            
    TextDrawLetterSize(Textdraw9[playerid], 0.0399990.999998);
            
    TextDrawColor(Textdraw9[playerid], 0xFFFF00AA);
            
    TextDrawSetOutline(Textdraw9[playerid], 0);
            
    TextDrawSetProportional(Textdraw9[playerid], 1);
            
    TextDrawSetShadow(Textdraw9[playerid], 1);
        }
        
    Drift_SetGlobalCheck(true);
        
    //configure the DriftingPointsCounter plugin
        
    DriftSet_DamageCheck();//enable damage checking
        
    DriftSet_UpdateDelay(8);//set the each plugin loop to 8 sa-mp ticks (5 ms sleep + tick time of sa-mp for executing it's loops etc and other plugins)
        
    DriftSet_Divider(3000);//the points divider so our players won't get superb high score, how bigger the divider , the less score they get
        
    DriftSet_StartEndDelay(30);//the counter in ticks (UpdateDelay*30 sa-mp ticks) which will say when a player is not drifting anymore
        
    DriftSet_MinimalAngle(15.5);//minimal angle to start a drift
         
    DriftSet_MinimalSpeed(25.5);//minimal speed ""
        
    AddStaticVehicle(4700.00.011.0180.123100);
        return 
    1;
    }

    public 
    OnGameModeExit()//OnFilterScriptExit
    {
        for(new 
    playerid 0playerid GetMaxPlayers()-1; ++playerid)
        {
            if(
    Timer[playerid] != (-1))KillTimer(Timer[playerid]);
            
    TextDrawHideForPlayer(playeridTextdraw0[playerid]);
            
    TextDrawHideForPlayer(playeridTextdraw1[playerid]);
            
    TextDrawHideForPlayer(playeridTextdraw2[playerid]);
            
    TextDrawHideForPlayer(playeridTextdraw3[playerid]);

            
    TextDrawHideForPlayer(playeridTextdraw4[playerid]);
            
    TextDrawHideForPlayer(playeridTextdraw5[playerid]);
            
    TextDrawHideForPlayer(playeridTextdraw6[playerid]);

            
    TextDrawHideForPlayer(playeridTextdraw7[playerid]);
            
            
    TextDrawHideForPlayer(playeridTextdraw8[playerid]);
            
    TextDrawHideForPlayer(playeridTextdraw9[playerid]);
            
            
    TextDrawDestroy(Textdraw0[playerid]);
            
    TextDrawDestroy(Textdraw1[playerid]);
            
    TextDrawDestroy(Textdraw2[playerid]);
            
    TextDrawDestroy(Textdraw3[playerid]);
            
    TextDrawDestroy(Textdraw4[playerid]);
            
    TextDrawDestroy(Textdraw5[playerid]);
            
    TextDrawDestroy(Textdraw6[playerid]);
            
    TextDrawDestroy(Textdraw7[playerid]);
            
    TextDrawDestroy(Textdraw8[playerid]);
            
    TextDrawDestroy(Textdraw9[playerid]);
        }
        return 
    1;
    }

    public 
    OnPlayerKeyStateChange(playeridnewkeysoldkeys)
    {
        if(
    GetPlayerState(playerid) == PLAYER_STATE_DRIVER)//player is driver
        
    {
            new 
    Car GetPlayerVehicleID(playerid), Model GetVehicleModel(Car);//get the VehicleID and Model
            
    switch(Model)//check model for allowed type to add nitro, if not allowed return 0;
            
    {
                case 
    446,432,448,452,424,453,454,461,462,463,468,471,430,472,449,473,481,484,493,495,509,510,521,538,522,523,532,537,570,581,586,590,569,595,604,611: return 0;
            }
            if((
    PRESSED(KEY_FIRE) || PRESSED(KEY_ACTION))//is player holding key_fire OR key_action?
            
    && Drift_VAR[playerid][NitroLeft] > 0)//and his nitro is greater than 0?
            
    {
                
    Drift_VAR[playerid][using] = true;//then the player is using nitro
                
    AddVehicleComponent(Car1010);//so we add the component to his vehicle
            
    }
            else
            {
                
    Drift_VAR[playerid][using] = false;//player is not using nitro
                
    RemoveVehicleComponent(Car,1010);//so we remove the component
            
    }
        }
        return 
    1;
    }

    //our callback which gets called when the player starts drifting
    public OnPlayerDriftStart(playerid)
    {
        print(
    "OnPlayerDriftStart1");
        if(
    Timer[playerid] != (-1))KillTimer(Timer[playerid]);//check if we already created a timer, if yes - destroy it
        
    CurrPoints[playerid] = 0;//set the current drift points to 0

         //show the textdraw for counting current drift points and set it's text to "0"
        
    TextDrawShowForPlayer(playeridTextdraw7[playerid]);
        
    TextDrawSetString(Textdraw7[playerid],"0");
        
        
    //do some combo (X's) checks and set the according information, like in NFSUG2
        
    if(Drift_VAR[playerid][Combo] == 1)//got x1
        
    {
            
    TextDrawSetString(Textdraw2[playerid],"~G~X1");
            
    TextDrawSetString(Textdraw3[playerid],"Gain ~G~X2~W~ with:~N~_______350");
        }else if(
    Drift_VAR[playerid][Combo] == 2)//got x2
        
    {
            
    TextDrawSetString(Textdraw2[playerid],"~G~X2");
            
    TextDrawSetString(Textdraw3[playerid],"Gain ~G~X3~W~ with:~N~_______1400");
        }else if(
    Drift_VAR[playerid][Combo] == 3)//got x3
        
    {
            
    TextDrawSetString(Textdraw2[playerid],"~G~X3");
            
    TextDrawSetString(Textdraw3[playerid],"Gain ~G~X4~W~ with:~N~_______4200");
        }else if(
    Drift_VAR[playerid][Combo] == 4)//got x4
        
    {
            
    TextDrawSetString(Textdraw2[playerid],"~G~X4");
            
    TextDrawSetString(Textdraw3[playerid],"Gain ~G~X5~W~ with:~N~_______11500");
        }else
    //got x5
        
    {
            
    TextDrawSetString(Textdraw2[playerid],"~G~X5");
            
    TextDrawSetString(Textdraw3[playerid],"____ ~G~MAX~W~ ~N~_______---");
        }
        return 
    1;
    }

    //our callback which gets called when the player is drifting AFTER OnPlayerDriftStart is called.
    public OnPlayerDriftUpdate(playerid,value,combo,flagid,Float:distance,Float:speed)
    {
        print(
    "OnPlayerDriftUpdate");
        
    CurrPoints[playerid]+=(value*Drift_VAR[playerid][Combo]);//append to the current drift points our drifting score

        //again some X's checks
        
    if(CurrPoints[playerid] < 350)//get x1
        
    {
            if(
    Drift_VAR[playerid][Combo] < 2)//check if the player hasn't a higher combo yet
            
    {
                
    Drift_VAR[playerid][Combo] = 1;
                
    TextDrawSetString(Textdraw2[playerid],"~G~X1");
                
    TextDrawSetString(Textdraw3[playerid],"Gain ~G~X2~W~ with:~N~_______350");
            }
        }
        else if(
    CurrPoints[playerid] < 1400)//get x2
        
    {
            if(
    Drift_VAR[playerid][Combo] < 3)
            {
                
    Drift_VAR[playerid][Combo] = 2;
                
    TextDrawSetString(Textdraw2[playerid],"~G~X2");
                
    TextDrawSetString(Textdraw3[playerid],"Gain ~G~X3~W~ with:~N~_______1400");
            }
        }
        else if(
    CurrPoints[playerid] < 4200)//get x3
        
    {
            if(
    Drift_VAR[playerid][Combo] < 4)
            {
                
    Drift_VAR[playerid][Combo] = 3;
                
    TextDrawSetString(Textdraw2[playerid],"~G~X3");
                
    TextDrawSetString(Textdraw3[playerid],"Gain ~G~X4~W~ with:~N~_______4200");
            }
        }
        else if(
    CurrPoints[playerid] < 11500)//get x4
        
    {
             if(
    Drift_VAR[playerid][Combo] < 5)
            {
                
    Drift_VAR[playerid][Combo] = 4;
                
    TextDrawSetString(Textdraw2[playerid],"~G~X4");
                
    TextDrawSetString(Textdraw3[playerid],"Gain ~G~X5~W~ with:~N~_______11500");
            }
        }
        else
    //get x5
        
    {
            
    Drift_VAR[playerid][Combo] = 5;
            
    TextDrawSetString(Textdraw2[playerid],"~G~X5");
            
    TextDrawSetString(Textdraw3[playerid],"____ ~G~MAX~W~ ~N~_______---");
        }
        
    //format and set the current drifting points
        
    format(s,255,"%d",CurrPoints[playerid]);
        
    TextDrawSetString(Textdraw7[playerid],s);
        
        
    //update our main scoreboard
        
    format(s,255,"Best:~Y~%d~N~~N~~N~~N~~W~Score:~R~%d",Drift_VAR[playerid][Best],Drift_VAR[playerid][Score]);
        
    TextDrawSetString(Textdraw1[playerid],s);
        
    printf("%d %d %d",CurrPoints[playerid],Drift_VAR[playerid][Best],Drift_VAR[playerid][Score]);
        return 
    1;
    }

    //this gets called after the player didn't start a drift in the required time, so his drift is ended
    public OnPlayerDriftEnd(playerid,value,combo,reason)
    {
        print(
    "OnPlayerDriftEnd");
        
    Drift_SetPlayerCheck(playerid,0);//we disable the player from the DriftingPointsCounter, this player cannot drift now, OnPlayerDriftStart won't be called
        
    if(reason != DRIFT_REASON_CAR_DAMAGED)//The car wasn't damaged, so the drift was succesful (however the player could jump out of the car...
        
    {
            if(
    CurrPoints[playerid] > Drift_VAR[playerid][Best])Drift_VAR[playerid][Best] = CurrPoints[playerid];//check if the player beat his best score, if yes set the temporary score to the best score
            
    Drift_VAR[playerid][Score]+=CurrPoints[playerid];//update our main score with our temporary score
            
    Drift_VAR[playerid][NitroLeft]+=floatround(CurrPoints[playerid]/POINTS_TO_GET_ONE_NITRO);//some nitro adding code
            
    if(Drift_VAR[playerid][NitroLeft] > MAX_NITRO)Drift_VAR[playerid][NitroLeft] = MAX_NITRO;//set a MAX on nitro value
            
    SetTimerEx("RestoreDrift",150,0,"d",playerid);//Set a timed public execution with the passed playerid parameter
        
    }
        else if(
    reason == DRIFT_REASON_CAR_DAMAGED)//OMG WTF NISIBNFIN$!!! THE CAR GOT DAMAGED OHWTF! BAN HIMWM!!!!
        
    {
            if(
    Timer[playerid] != (-1))KillTimer(Timer[playerid]);
            
    Drift_VAR[playerid][Combo] = 1;
            
    TextDrawSetString(Textdraw2[playerid],"~G~X1");
            
    TextDrawSetString(Textdraw3[playerid],"Gain ~G~X2~W~ with:~N~_______350");
            
    Timer[playerid] = -1;
            
    format(s,255,"~r~%d",CurrPoints[playerid]);//make our textdraw red with ~r~
            
    TextDrawSetString(Textdraw7[playerid],s);//update the textdraw
            
    SetTimerEx("RestoreDrift",1250,0,"d",playerid);//we won't hide the textdraw now, just let the player see the red buhahaha, he deserves it.
        
    }
        
        
    CurrPoints[playerid] = 0;//set the temporary points (again) to 0, so the next drift will have a 'fresh start'
        
        
    if(Timer[playerid] != (-1))KillTimer(Timer[playerid]);//again our timer thingy...
        
    if(Drift_VAR[playerid][Combo] == 1)//got x1
        
    {
            
    TextDrawSetString(Textdraw2[playerid],"~G~X1");
            
    TextDrawSetString(Textdraw3[playerid],"Gain ~G~X2~W~ with:~N~_______350");
            
    Timer[playerid] = -1;
        }else if(
    Drift_VAR[playerid][Combo] == 2)//got x2
        
    {
            
    TextDrawSetString(Textdraw2[playerid],"~G~X2");
            
    TextDrawSetString(Textdraw3[playerid],"Gain ~G~X3~W~ with:~N~_______1400");

            
    //
            
    Timer[playerid] = SetTimerEx("DecreaseX",5000,0,"d",playerid);
            
    //if the player doesn't start a drift within 5 secs,
            //the timer won't get killed so this public will get called,
            //same apply for all other lines below
        
    }else if(Drift_VAR[playerid][Combo] == 3)//got x3
        
    {
            
    TextDrawSetString(Textdraw2[playerid],"~G~X3");
            
    TextDrawSetString(Textdraw3[playerid],"Gain ~G~X4~W~ with:~N~_______4200");
            
    Timer[playerid] = SetTimerEx("DecreaseX",3500,0,"d",playerid);
        }else if(
    Drift_VAR[playerid][Combo] == 4)//got x4
        
    {
            
    TextDrawSetString(Textdraw2[playerid],"~G~X4");
            
    TextDrawSetString(Textdraw3[playerid],"Gain ~G~X5~W~ with:~N~_______11500");
            
    Timer[playerid] = SetTimerEx("DecreaseX",2500,0,"d",playerid);
        }else
    //got x5
        
    {
            
    TextDrawSetString(Textdraw2[playerid],"~G~X5");
            
    TextDrawSetString(Textdraw3[playerid],"____ ~G~MAX~W~ ~N~_______---");
            
    Timer[playerid] = SetTimerEx("DecreaseX",1000,0,"d",playerid);
        }
        
    //update our main scoreboard again
        
    format(s,255,"Best:~Y~%d~N~~N~~N~~N~~W~Score:~R~%d",Drift_VAR[playerid][Best],Drift_VAR[playerid][Score]);
        
    TextDrawSetString(Textdraw1[playerid],s);
        return 
    1;
    }

    //here is our little magic to enable the drifting again
    forward RestoreDrift(playerid);
    public 
    RestoreDrift(playerid)
    {
        
    Drift_SetPlayerCheck(playerid,1);//enable the player in the plugin
        
    TextDrawHideForPlayer(playeridTextdraw7[playerid]);//hide the temporary score textdraw, no more red or normal score
        
    return 1;
    }

    //here is our X's decrease code.. we won't give the player unlimited X's, he has to use them in time!
    forward DecreaseX(playerid);
    public 
    DecreaseX(playerid)
    {
        
    Drift_VAR[playerid][Combo]-=1;
        if(
    Drift_VAR[playerid][Combo] < 1)Drift_VAR[playerid][Combo] = 1;//prevention...
        
    if(Timer[playerid] != (-1))KillTimer(Timer[playerid]);//you've seen this before my mate...
        
        //now our X's decrease code
        
    if(Drift_VAR[playerid][Combo] == 1)//got x1
        
    {
            
    TextDrawSetString(Textdraw2[playerid],"~G~X1");
            
    TextDrawSetString(Textdraw3[playerid],"Gain ~G~X2~W~ with:~N~_______350");
            
    Timer[playerid] = -1;
        }else if(
    Drift_VAR[playerid][Combo] == 2)//got x2
        
    {
            
    //so the player had X3, now he will have X2....
            //poor player didn't make it in time,
            //anyway he still has X2, so let's give him 5 seconds to re-drift and get him some points!
            //same apples for lines below
            
    TextDrawSetString(Textdraw2[playerid],"~G~X2");
            
    TextDrawSetString(Textdraw3[playerid],"Gain ~G~X3~W~ with:~N~_______1400");
            
    Timer[playerid] = SetTimerEx("DecreaseX",5000,0,"d",playerid);//call this callback again
        
    }else if(Drift_VAR[playerid][Combo] == 3)//got x3
        
    {
            
    TextDrawSetString(Textdraw2[playerid],"~G~X3");
            
    TextDrawSetString(Textdraw3[playerid],"Gain ~G~X4~W~ with:~N~_______4200");
            
    Timer[playerid] = SetTimerEx("DecreaseX",3500,0,"d",playerid);
        }else if(
    Drift_VAR[playerid][Combo] == 4)//got x4
        
    {
            
    TextDrawSetString(Textdraw2[playerid],"~G~X4");
            
    TextDrawSetString(Textdraw3[playerid],"Gain ~G~X5~W~ with:~N~_______11500");
            
    Timer[playerid] = SetTimerEx("DecreaseX",2500,0,"d",playerid);
        }else
    //got x5
        
    {
            
    TextDrawSetString(Textdraw2[playerid],"~G~X5");
            
    TextDrawSetString(Textdraw3[playerid],"____ ~G~MAX~W~ ~N~_______---");
            
    Timer[playerid] = SetTimerEx("DecreaseX",1000,0,"d",playerid);
        }
        return 
    1;
    }

    //variable for holding float data
    new Float:fvar[8];
    public 
    OnPlayerUpdate(playerid)//our little friend, which can lag us.
    {
        if(!
    IsPlayerInAnyVehicle(playerid))return 1;//player is not in a vehicle
        
    if(Drift_VAR[playerid][using] == true)//if player is using nitro
            
    Drift_VAR[playerid][NitroLeft]--;//decrease his amount of nitro by 1
        
    new vehid GetPlayerVehicleID(playerid);//get the players vehicleid
        
    GetVehicleVelocity(vehid,fvar[0],fvar[1],fvar[2]);//get the players X speed, Y speed and Z speed
        
    GetVehicleZAngle(vehid,fvar[7]);//get the players vehicle Z angle
        
    if(Drift_VAR[playerid][NitroLeft] < 0)//if nitro is below 0
        
    {
            
    Drift_VAR[playerid][NitroLeft] = 0;//set to 0
            
    Drift_VAR[playerid][using] = false;//player is not using it because...
            
    RemoveVehicleComponent(vehid,1010);//...we remove it
         
    }
         
         new 
    Float:Xtemp floatmul(floatdiv(Drift_VAR[playerid][NitroLeft],MAX_NITRO),100.0);
         new 
    AmountView floatround(Xtemp);

        
    s[0] = 0;
        for(new 
    0AmountView; ++i)
        {
            
    strins(s,"/",0);
        }
         
    TextDrawSetString(Textdraw9[playerid],s);

        new 
    Float:Angle RealDifference(fvar[7],GetVelocityHeading(fvar[0],fvar[1],fvar[7]));//now we calculate his difference between his heading and his angle
        
    new Float:Speed floatsqroot((fvar[0]*fvar[0])+(fvar[1]*fvar[1])+(fvar[2]*fvar[2]))*274.0;//calculate players speed
        
    format(s,255,"%.0f km/h~n~_____%.0f",Speed,Angle);//format our nice string and...
        
    TextDrawSetString(Textdraw6[playerid],s);//...update our speedo and driftmeter textdraw
        
    return 1;
    }

    public 
    OnPlayerStateChange(playeridnewstateoldstate)//yay, player does something, we actually need to monitor
    {
        if(
    oldstate == PLAYER_STATE_DRIVER)//the player was a driver so...
        
    {
        
    //hide all TD's
            
    TextDrawHideForPlayer(playeridTextdraw0[playerid]);
            
    TextDrawHideForPlayer(playeridTextdraw1[playerid]);
            
    TextDrawHideForPlayer(playeridTextdraw2[playerid]);
            
    TextDrawHideForPlayer(playeridTextdraw3[playerid]);

            
    TextDrawHideForPlayer(playeridTextdraw4[playerid]);
            
    TextDrawHideForPlayer(playeridTextdraw5[playerid]);
            
    TextDrawHideForPlayer(playeridTextdraw6[playerid]);
            
            
    TextDrawHideForPlayer(playeridTextdraw7[playerid]);
            
            
    TextDrawHideForPlayer(playeridTextdraw8[playerid]);
            
    TextDrawHideForPlayer(playeridTextdraw9[playerid]);
        }
        if(
    newstate == PLAYER_STATE_DRIVER)//and the players new state is a driver (also?) so
        
    {
        
    //we show the TD's and do a little scoreboard update
            
    TextDrawShowForPlayer(playeridTextdraw0[playerid]);
            
    TextDrawShowForPlayer(playeridTextdraw1[playerid]);
            
    TextDrawShowForPlayer(playeridTextdraw2[playerid]);
            
    TextDrawShowForPlayer(playeridTextdraw3[playerid]);
            
            
    TextDrawShowForPlayer(playeridTextdraw4[playerid]);
            
    TextDrawShowForPlayer(playeridTextdraw5[playerid]);
            
    TextDrawShowForPlayer(playeridTextdraw6[playerid]);

            
    TextDrawShowForPlayer(playeridTextdraw8[playerid]);
            
    TextDrawShowForPlayer(playeridTextdraw9[playerid]);

            
    format(s,255,"Best:~Y~%d~N~~N~~N~~N~~W~Score:~R~%d",Drift_VAR[playerid][Best],Drift_VAR[playerid][Score]);
            
    TextDrawSetString(Textdraw1[playerid],s);
            
    TextDrawSetString(Textdraw3[playerid],"Gain ~G~X2~W~ with:~N~_______350");
            
    TextDrawSetString(Textdraw2[playerid],"~G~X1");
        }
        return 
    1;
    }

    //calculation functions.. maths etc
    forward Float:RealDifference(Float:A,Float:H);
    stock Float:RealDifference(Float:A,Float:H)//Get smallest difference
    {
        new 
    Float:diff H-A;
        if(
    diff < -180.0)diff+=360.0;
        if(
    diff 180.0)diff-=360.0;
        return 
    floatabs(diff);
    }

    forward Float:GetVelocityHeading(Float:Vx,Float:Vy,Float:VZA);
    stock Float:GetVelocityHeading(Float:Vx,Float:Vy,Float:VZA)//Get heading angle
    {
        if(
    Vy == 0.0)
            
    Vy 0.0000000001;//prevent division by 0
        
    if(Vx Vy)
            return 
    0   atan(Vx/Vy);
        else if((
    Vx Vy) || (Vx Vy))
            return 
    180 atan(Vx/Vy);
        else if(
    Vx Vy)
            return 
    360 atan(Vx/Vy);
        else
            return 
    VZA;//we have no speed in X, so the players angle can't be determined, in this case we return the vehicle angle instead of the heading which can't be determined

    Что именно не работает?
      Открыть/закрыть
    PAWN Compiler делает то, что вы приказали ему сделать, а не то, что вы хотели, чтобы он сделал..

    25% времени в программировании уходит на размышления о том, что пользователь может сделать не так.[HR]/Брайан Хьюмс/





    #FIXSAMP

  11. #9
    Аватар для vovandolg
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,353
    Репутация:
    113 ±
    Да вот прям именно всё и не работает)) плагин пишет загружен,
    мод компилировал с тем инклудом что по версии идёт,
    пробовал плагин старее версий тоже самое,
    может какая то библиотека особая нужна на компе?

    Странно даже ошибок не каких не было ...
    [Anticheat]___Invisible Fly Hack
    [Anticheat]____Weapon/Ammo Hack
    [Function]______ResetPlayerWeaponSlot
    [Function]_______FIX_SetPlayerAmmo
    [ServerMod]______TDM | Zombie Apokalypse

  12. #10
    Аватар для [ForD]
    Пользователь

    Статус
    Оффлайн
    Регистрация
    14.11.2013
    Адрес
    Свердловская обл.
    Сообщений
    702
    Репутация:
    104 ±
    Цитата Сообщение от vovandolg Посмотреть сообщение
    Да вот прям именно всё и не работает)) плагин пишет загружен,
    мод компилировал с тем инклудом что по версии идёт,
    пробовал плагин старее версий тоже самое,
    может какая то библиотека особая нужна на компе?

    Странно даже ошибок не каких не было ...
    По сути даже не знаю, взял твой код,скомпилировал,все без ошибок, запустил,все работает, скрин консоли вложил в посте,колбэки срабатывают,не пробовал скачать по новой сервер,плагин и т.д. ?
    Будет что-то новое пиши.
    PAWN Compiler делает то, что вы приказали ему сделать, а не то, что вы хотели, чтобы он сделал..

    25% времени в программировании уходит на размышления о том, что пользователь может сделать не так.[HR]/Брайан Хьюмс/





    #FIXSAMP

 

 
Страница 1 из 2 12 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •