PDA

Просмотр полной версии : [Plugin] Drift Points Counter Plug-In by Gamer_Z (Полупотраченый перевод)



[ForD]
27.05.2014, 08:56
Данный пост будет представлять собой небольшой разбор плагина подсчета дрифт-очков by Gamer_Z


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



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


native DriftSet_UpdateDelay(delay);


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

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

native DriftGet_UpdateDelay();


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

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



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

native DriftSet_MinimalSpeed(Float:MinimalSpeed,playerid = (-1));


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

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

native DriftGet_MinimalSpeed(&Float:MinimalSpeed,playerid = (0));


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 i; i < MAX_PLAYERS; ++i)
{
DriftGet_MinimalSpeed(AllSpeed[i],i);
}
//Код выше будет получать минимальную скорость для подсчета дрифта от всех игроков и передает ее в массив AllSpeed что-бы проверить всех игроков на значение минимальной скорости подсчета дрифта
new IsEverybodySynced = 1;//присвоим новой переменной 1
for(new i; i < MAX_PLAYERS-1; ++i)
{
if(AllSpeed[i] != AllSpeed[i+1])
{
IsEverybodySynced = 0;//Если не все имеют одинаковую минимальную скорость подсчета дрифта
break;//Выйдем из цикла,"мы получили то,что мы хотели"
}
}
if(IsEverybodySynced == 0)
{
print("Не все имеют одинаковую минимальную скорость подсчета дрифта!");
}
return 1;
}
Эта функция не возвращает никакого значения.



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

native DriftSet_MaximalSpeed(Float:MaximalSpeed,playerid = (-1));


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

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

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

native DriftGet_MaximalSpeed(&Float:MaximalSpeed,playerid = (0));


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 i; i < MAX_PLAYERS; ++i)
{
DriftGet_MaximalSpeed(AllSpeed[i],i);
}
//Код выше будет получать максимальную скорость для подсчета дрифта от всех игроков и передает ее в массив AllSpeed что-бы проверить всех игроков на значение максимальной скорости подсчета дрифта
new IsEverybodySynced = 1;//присвоим новой переменной 1
for(new i; i < MAX_PLAYERS-1; ++i)
{
if(AllSpeed[i] != AllSpeed[i+1])
{
IsEverybodySynced = 0;//Если не все имеют одинаковую максимальную скорость подсчета дрифта
break;//Выйдем из цикла,"мы получили то,что мы хотели"
}
}
if(IsEverybodySynced == 0)
{
print("Не все имеют одинаковую максимальную скорость подсчета дрифта!");
}
return 1;
}
Эта функция не возвращает никакого значения.



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


native DriftSet_MinimalAngle(Float:MinimalAngle,playerid = (-1));


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

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

native DriftGet_MinimalAngle(&Float:MinimalAngle,playerid = (0));


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;
}

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



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

native DriftSet_MaximalAngle(Float:MaximalAngle,playerid = (-1));


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

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

native DriftGet_MaximalAngle(&Float:MaximalAngle,playerid = (0));

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



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


native DriftSet_StartEndDelay(delay,playerid = (-1));



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

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

native DriftGet_StartEndDelay(playerid = (0));


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

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



Устанавливает разделитель очков, так что вы не будете получать огромное количество очков в OnDirftUpdate и OnDriftEnd. по умолчанию 350.

native DriftSet_Divider(divider,playerid = (-1));


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

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

native DriftGet_Divider(playerid = (0));


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

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



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

native DriftSet_DamageCheck(enable = 1,playerid = (-1),Float:MaxHealthLoose = 0.0);//default = disabled (0), enabled = 1


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;
}

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

native DriftGet_DamageCheck(playerid = (0),&Float:MaxHealthLoose = 0);


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

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



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

native IsPlayerDrifting(playerid);



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

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


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

forward OnPlayerDriftStart(playerid);


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

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


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

forward OnPlayerDriftUpdate(playerid,value,combo,flagid,Float:distance,Float:speed);



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;
}

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


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


forward OnPlayerDriftEnd(playerid,value,combo,reason);



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, функция на самом деле говорит вам о том,что автомобиль действительно (на момент вызова) дрифтует,а не сам игрок.

native IsPlayerDrifting_precise(playerid);


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 если нет.



Добавляет зону в которой начисляются бонусные очки за дрифт.

native Drift_AddFLAG(Float:X,Float:Y,Float:Z);


public OnFilterScriptInit()
{
new MyFlag = Drift_AddFLAG(462.283,2576.455,953.235);
return 1;
}

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

Отключает Drift Checkpoint.

native Drift_DisableFLAG(flagid);


public OnFilterScriptInit()
{
new MyFlag = Drift_AddFLAG(462.283,2576.455,953.235);
Drift_DisableFLAG(MyFlag);
return 1;
}

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

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

native Drift_DeleteFLAG(flagid);


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

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

Включает выключенную(или удаленную) бонусную зону.

native Drift_EnableFLAG(flagid);


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

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

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

native Drift_MoveFLAG(flagid,Float:X,Float:Y,Float:Z);


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

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

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

native Drift_SetCheckForFlags(enabled = 1,playerid =(-1));


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

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


native Drift_GetCheckForFlags(playerid = 0);


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

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



Этот native используется внутри плагина для получения вектора игроков,не рекомендуется использовать это, если вы не знаете, что вы делаете!

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


Включает/Отключает весь плагин,может быть использовано в любое время.

native Drift_SetGlobalCheck(enable = 1);


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

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

native Drift_GetGlobalCheck();


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

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



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

native Drift_SetPlayerCheck(playerid = (-1),enable = 1);


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

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


native Drift_GetPlayerCheck(playerid = (0));


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

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



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

native Drift_SetBackwardsCheck(enabled = 1,playerid =(-1));


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

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


native Drift_GetBackwardsCheck(playerid = 0);



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

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



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


native Drift_SetDriftMaxHealthLoose(Float:MaximalHealthLoose = 0.0,playerid = (-1));

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



native Drift_GetDriftMaxHealthLoose(&Float:MaximalHealthLoose,playerid = (0));


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`



Перейти (http://forum.sa-mp.com/showthread.php?t=267677)




Скачать (https://github.com/grasmanek94/DriftPointsCounter/archive/master.zip)
GitGub (https://github.com/grasmanek94/DriftPointsCounter)


Перейти (https://github.com/grasmanek94?tab=repositories)


Wiki (https://github.com/grasmanek94/GPB/tree/master/wiki)



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

Специально для:Pro-Pawn.Ru (http://pro-pawn.ru)

Копирование данной статьи без разрешения автора запрещено! by Salvacore

DeimoS
27.05.2014, 12:17
Между спойлерами поставь пару пробелов. На тёмном стиле глаза просто просят остановить планету и сходят с неё. Сливается всё

[ForD]
27.05.2014, 13:02
Между спойлерами поставь пару пробелов. На тёмном стиле глаза просто просят остановить планету и сходят с неё. Сливается всё

Учту,доделаю позже..

$continue$
14.07.2015, 21:28
Не плохо.

Иван Бубнов
08.02.2016, 11:20
Обновите плагин для 0.3.7 R2!

[ForD]
08.02.2016, 12:55
Обновите плагин для 0.3.7 R2!

Есть спойлер "Оф. тема" ,если у вас есть вопросы по плагину, то думаю их стоит задать именно там.

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

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

P.S. Использую данный плагин, который скачан по ссылке указанной в теме,проблем нет.

vovandolg
25.11.2016, 18:49
;69161']P.S. Использую данный плагин, который скачан по ссылке указанной в теме,проблем нет.
Плагин установлен, компилировал с его же инклудом, sampgdk в папке с сервом лежит, запускаю на винде, ошибок нету, паблики дрифта не вызываются, точно проблем нет?
Быдлокод не мой, но он рабочий по идее, я его просто с фс в гм преобразовал...


//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(playerid, Textdraw0[playerid]);
TextDrawHideForPlayer(playerid, Textdraw1[playerid]);
TextDrawHideForPlayer(playerid, Textdraw2[playerid]);
TextDrawHideForPlayer(playerid, Textdraw3[playerid]);

TextDrawHideForPlayer(playerid, Textdraw4[playerid]);
TextDrawHideForPlayer(playerid, Textdraw5[playerid]);
TextDrawHideForPlayer(playerid, Textdraw6[playerid]);

TextDrawHideForPlayer(playerid, Textdraw7[playerid]);

TextDrawHideForPlayer(playerid, Textdraw8[playerid]);
TextDrawHideForPlayer(playerid, Textdraw9[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(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
for(new playerid = 0; playerid < GetMaxPlayers()-1/*MAX_PLAYERS*/; ++playerid)//F*ck the limit...
{
Textdraw0[playerid] = TextDrawCreate(20.000000, 131.000000, "_~N~_~N~_~N~_~N~_~N~_~N~_~N~_~N~_~N~_~N~_");
TextDrawBackgroundColor(Textdraw0[playerid], 255);
TextDrawFont(Textdraw0[playerid], 1);
TextDrawLetterSize(Textdraw0[playerid], 0.500000, 0.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.000000, 0.000000);

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

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

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

Textdraw4[playerid] = TextDrawCreate(640.000000, 412.000000, "~N~");
TextDrawBackgroundColor(Textdraw4[playerid], 255);
TextDrawFont(Textdraw4[playerid], 1);
TextDrawLetterSize(Textdraw4[playerid], 0.519999, 1.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.000000, 0.000000);

Textdraw5[playerid] = TextDrawCreate(619.000000, 419.000000, "o");
TextDrawBackgroundColor(Textdraw5[playerid], 369098796);
TextDrawFont(Textdraw5[playerid], 2);
TextDrawLetterSize(Textdraw5[playerid], 0.300000, 0.699998);
TextDrawColor(Textdraw5[playerid], -1);
TextDrawSetOutline(Textdraw5[playerid], 1);
TextDrawSetProportional(Textdraw5[playerid], 1);

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

Textdraw7[playerid] = TextDrawCreate(320.000000, 150.000000, "1000000");
TextDrawAlignment(Textdraw7[playerid], 2);
TextDrawBackgroundColor(Textdraw7[playerid], 369098796);
TextDrawFont(Textdraw7[playerid], 3);
TextDrawLetterSize(Textdraw7[playerid], 0.449999, 1.500000);
TextDrawColor(Textdraw7[playerid], 0xF9FF8FEE);
TextDrawSetOutline(Textdraw7[playerid], 1);
TextDrawSetProportional(Textdraw7[playerid], 1);

//
Textdraw8[playerid] = TextDrawCreate(601.000000, 399.000000, "N2O");
TextDrawAlignment(Textdraw8[playerid], 2);
TextDrawBackgroundColor(Textdraw8[playerid], 255);
TextDrawFont(Textdraw8[playerid], 1);
TextDrawLetterSize(Textdraw8[playerid], 0.250000, 0.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.000000, 63.000000);

Textdraw9[playerid] = TextDrawCreate(570.000000, 396.000000, "////////////////////////////////////////////////////////////////////////////////////////////////////");
TextDrawBackgroundColor(Textdraw9[playerid], 255);
TextDrawFont(Textdraw9[playerid], 1);
TextDrawLetterSize(Textdraw9[playerid], 0.039999, 0.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(470, 0.0, 0.0, 11.0, 180.1231, 0, 0);
return 1;
}

public OnGameModeExit()//OnFilterScriptExit
{
for(new playerid = 0; playerid < GetMaxPlayers()-1; ++playerid)
{
if(Timer[playerid] != (-1))KillTimer(Timer[playerid]);
TextDrawHideForPlayer(playerid, Textdraw0[playerid]);
TextDrawHideForPlayer(playerid, Textdraw1[playerid]);
TextDrawHideForPlayer(playerid, Textdraw2[playerid]);
TextDrawHideForPlayer(playerid, Textdraw3[playerid]);

TextDrawHideForPlayer(playerid, Textdraw4[playerid]);
TextDrawHideForPlayer(playerid, Textdraw5[playerid]);
TextDrawHideForPlayer(playerid, Textdraw6[playerid]);

TextDrawHideForPlayer(playerid, Textdraw7[playerid]);

TextDrawHideForPlayer(playerid, Textdraw8[playerid]);
TextDrawHideForPlayer(playerid, Textdraw9[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(playerid, newkeys, oldkeys)
{
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(Car, 1010);//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(playerid, Textdraw7[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(playerid, Textdraw7[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 i = 0; i < AmountView; ++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(playerid, newstate, oldstate)//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(playerid, Textdraw0[playerid]);
TextDrawHideForPlayer(playerid, Textdraw1[playerid]);
TextDrawHideForPlayer(playerid, Textdraw2[playerid]);
TextDrawHideForPlayer(playerid, Textdraw3[playerid]);

TextDrawHideForPlayer(playerid, Textdraw4[playerid]);
TextDrawHideForPlayer(playerid, Textdraw5[playerid]);
TextDrawHideForPlayer(playerid, Textdraw6[playerid]);

TextDrawHideForPlayer(playerid, Textdraw7[playerid]);

TextDrawHideForPlayer(playerid, Textdraw8[playerid]);
TextDrawHideForPlayer(playerid, Textdraw9[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(playerid, Textdraw0[playerid]);
TextDrawShowForPlayer(playerid, Textdraw1[playerid]);
TextDrawShowForPlayer(playerid, Textdraw2[playerid]);
TextDrawShowForPlayer(playerid, Textdraw3[playerid]);

TextDrawShowForPlayer(playerid, Textdraw4[playerid]);
TextDrawShowForPlayer(playerid, Textdraw5[playerid]);
TextDrawShowForPlayer(playerid, Textdraw6[playerid]);

TextDrawShowForPlayer(playerid, Textdraw8[playerid]);
TextDrawShowForPlayer(playerid, Textdraw9[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 < 0 < Vy)
return 0 - atan(Vx/Vy);
else if((Vx < 0 > Vy) || (Vx > 0 > Vy))
return 180 - atan(Vx/Vy);
else if(Vx > 0 < 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
}

[ForD]
19.12.2016, 16:38
Плагин установлен, компилировал с его же инклудом, sampgdk в папке с сервом лежит, запускаю на винде, ошибок нету, паблики дрифта не вызываются, точно проблем нет?
Быдлокод не мой, но он рабочий по идее, я его просто с фс в гм преобразовал...


//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(playerid, Textdraw0[playerid]);
TextDrawHideForPlayer(playerid, Textdraw1[playerid]);
TextDrawHideForPlayer(playerid, Textdraw2[playerid]);
TextDrawHideForPlayer(playerid, Textdraw3[playerid]);

TextDrawHideForPlayer(playerid, Textdraw4[playerid]);
TextDrawHideForPlayer(playerid, Textdraw5[playerid]);
TextDrawHideForPlayer(playerid, Textdraw6[playerid]);

TextDrawHideForPlayer(playerid, Textdraw7[playerid]);

TextDrawHideForPlayer(playerid, Textdraw8[playerid]);
TextDrawHideForPlayer(playerid, Textdraw9[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(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
for(new playerid = 0; playerid < GetMaxPlayers()-1/*MAX_PLAYERS*/; ++playerid)//F*ck the limit...
{
Textdraw0[playerid] = TextDrawCreate(20.000000, 131.000000, "_~N~_~N~_~N~_~N~_~N~_~N~_~N~_~N~_~N~_~N~_");
TextDrawBackgroundColor(Textdraw0[playerid], 255);
TextDrawFont(Textdraw0[playerid], 1);
TextDrawLetterSize(Textdraw0[playerid], 0.500000, 0.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.000000, 0.000000);

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

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

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

Textdraw4[playerid] = TextDrawCreate(640.000000, 412.000000, "~N~");
TextDrawBackgroundColor(Textdraw4[playerid], 255);
TextDrawFont(Textdraw4[playerid], 1);
TextDrawLetterSize(Textdraw4[playerid], 0.519999, 1.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.000000, 0.000000);

Textdraw5[playerid] = TextDrawCreate(619.000000, 419.000000, "o");
TextDrawBackgroundColor(Textdraw5[playerid], 369098796);
TextDrawFont(Textdraw5[playerid], 2);
TextDrawLetterSize(Textdraw5[playerid], 0.300000, 0.699998);
TextDrawColor(Textdraw5[playerid], -1);
TextDrawSetOutline(Textdraw5[playerid], 1);
TextDrawSetProportional(Textdraw5[playerid], 1);

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

Textdraw7[playerid] = TextDrawCreate(320.000000, 150.000000, "1000000");
TextDrawAlignment(Textdraw7[playerid], 2);
TextDrawBackgroundColor(Textdraw7[playerid], 369098796);
TextDrawFont(Textdraw7[playerid], 3);
TextDrawLetterSize(Textdraw7[playerid], 0.449999, 1.500000);
TextDrawColor(Textdraw7[playerid], 0xF9FF8FEE);
TextDrawSetOutline(Textdraw7[playerid], 1);
TextDrawSetProportional(Textdraw7[playerid], 1);

//
Textdraw8[playerid] = TextDrawCreate(601.000000, 399.000000, "N2O");
TextDrawAlignment(Textdraw8[playerid], 2);
TextDrawBackgroundColor(Textdraw8[playerid], 255);
TextDrawFont(Textdraw8[playerid], 1);
TextDrawLetterSize(Textdraw8[playerid], 0.250000, 0.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.000000, 63.000000);

Textdraw9[playerid] = TextDrawCreate(570.000000, 396.000000, "////////////////////////////////////////////////////////////////////////////////////////////////////");
TextDrawBackgroundColor(Textdraw9[playerid], 255);
TextDrawFont(Textdraw9[playerid], 1);
TextDrawLetterSize(Textdraw9[playerid], 0.039999, 0.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(470, 0.0, 0.0, 11.0, 180.1231, 0, 0);
return 1;
}

public OnGameModeExit()//OnFilterScriptExit
{
for(new playerid = 0; playerid < GetMaxPlayers()-1; ++playerid)
{
if(Timer[playerid] != (-1))KillTimer(Timer[playerid]);
TextDrawHideForPlayer(playerid, Textdraw0[playerid]);
TextDrawHideForPlayer(playerid, Textdraw1[playerid]);
TextDrawHideForPlayer(playerid, Textdraw2[playerid]);
TextDrawHideForPlayer(playerid, Textdraw3[playerid]);

TextDrawHideForPlayer(playerid, Textdraw4[playerid]);
TextDrawHideForPlayer(playerid, Textdraw5[playerid]);
TextDrawHideForPlayer(playerid, Textdraw6[playerid]);

TextDrawHideForPlayer(playerid, Textdraw7[playerid]);

TextDrawHideForPlayer(playerid, Textdraw8[playerid]);
TextDrawHideForPlayer(playerid, Textdraw9[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(playerid, newkeys, oldkeys)
{
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(Car, 1010);//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(playerid, Textdraw7[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(playerid, Textdraw7[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 i = 0; i < AmountView; ++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(playerid, newstate, oldstate)//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(playerid, Textdraw0[playerid]);
TextDrawHideForPlayer(playerid, Textdraw1[playerid]);
TextDrawHideForPlayer(playerid, Textdraw2[playerid]);
TextDrawHideForPlayer(playerid, Textdraw3[playerid]);

TextDrawHideForPlayer(playerid, Textdraw4[playerid]);
TextDrawHideForPlayer(playerid, Textdraw5[playerid]);
TextDrawHideForPlayer(playerid, Textdraw6[playerid]);

TextDrawHideForPlayer(playerid, Textdraw7[playerid]);

TextDrawHideForPlayer(playerid, Textdraw8[playerid]);
TextDrawHideForPlayer(playerid, Textdraw9[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(playerid, Textdraw0[playerid]);
TextDrawShowForPlayer(playerid, Textdraw1[playerid]);
TextDrawShowForPlayer(playerid, Textdraw2[playerid]);
TextDrawShowForPlayer(playerid, Textdraw3[playerid]);

TextDrawShowForPlayer(playerid, Textdraw4[playerid]);
TextDrawShowForPlayer(playerid, Textdraw5[playerid]);
TextDrawShowForPlayer(playerid, Textdraw6[playerid]);

TextDrawShowForPlayer(playerid, Textdraw8[playerid]);
TextDrawShowForPlayer(playerid, Textdraw9[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 < 0 < Vy)
return 0 - atan(Vx/Vy);
else if((Vx < 0 > Vy) || (Vx > 0 > Vy))
return 180 - atan(Vx/Vy);
else if(Vx > 0 < 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
}


Что именно не работает?
http://ihost.pro-pawn.ru/image.php?di=WM7O

vovandolg
22.12.2016, 05:01
Да вот прям именно всё и не работает)) плагин пишет загружен,
мод компилировал с тем инклудом что по версии идёт,
пробовал плагин старее версий тоже самое,
может какая то библиотека особая нужна на компе?

Странно даже ошибок не каких не было ...

[ForD]
22.12.2016, 21:37
Да вот прям именно всё и не работает)) плагин пишет загружен,
мод компилировал с тем инклудом что по версии идёт,
пробовал плагин старее версий тоже самое,
может какая то библиотека особая нужна на компе?

Странно даже ошибок не каких не было ...

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

vovandolg
23.12.2016, 06:59
;80264']По сути даже не знаю, взял твой код,скомпилировал,все без ошибок, запустил,все работает, скрин консоли вложил в посте,колбэки срабатывают,не пробовал скачать по новой сервер,плагин и т.д. ?
Будет что-то новое пиши.

Да я всё пробовал давно ещё(месяц назад), даже на другую ось ставил, так же плагин загружался без ошибок, а на деле не что не работало и это не у меня одного так, комментарии видел где то что тоже так же всё загружено без ошибок, а функции и каллбеки не фурычат.

[ForD]
24.12.2016, 11:45
Да я всё пробовал давно ещё(месяц назад), даже на другую ось ставил, так же плагин загружался без ошибок, а на деле не что не работало и это не у меня одного так, комментарии видел где то что тоже так же всё загружено без ошибок, а функции и каллбеки не фурычат.

Попробуй Клик (https://cloud.mail.ru/public/AXvj/M8if2473r)

vovandolg
28.12.2016, 19:29
;80331']Попробуй Клик (https://cloud.mail.ru/public/AXvj/M8if2473r)

так так)) рассказывай чем шаманил что заработало всё?

[ForD]
28.12.2016, 22:24
так так)) рассказывай чем шаманил что заработало всё?

- Скачал самп..
- Скачал плагин..
- Перемотал изолентой..
- Заработало и славно..

А так возможно дело в моем наборе dll`ок в корне сервера, у некоторых плагинов просто беда бывает когда нет каких либо dll файлов

Ну и как получается до этого ты не все проверил) Если разберешься в чем именно у тебя была проблема, то буду благодарен если отпишешь здесь.

vovandolg
10.01.2017, 01:14
Так ну на винде летает всё шикарно, а вот если на линукс закинуть то не работает,
причем GDK 4.5 я установил в корень сервера, получается на хостинге не хватает каких то библиотек?

[ForD]
10.01.2017, 03:32
Так ну на винде летает всё шикарно, а вот если на линукс закинуть то не работает,
причем GDK 4.5 я установил в корень сервера, получается на хостинге не хватает каких то библиотек?

На хостинге не доводилось его еще пробывать, незнаю даже чем помочь.
Найдешь решение отпишись.