All pastes #896495 Raw Edit

Miscellany

public text v1 · immutable
·published 2008-02-08 18:32 UTC
rendered paste body
/*
Drift/Race/Tune/Stunt GM
By: Splitx
Thx To: Kevin433 For Login/Register System
Thx To: Yagu's Race Filterscript v0.4a
Thx To: Every 1 That Helped Me out
-------------------------------------
!!DO NOT!!
Take Credits For This Script And Dont Say YOU Made It
-------------------------------------
YOU Can
Edit The Script And Use It On Ur Server xD But Leave My Credits And The Other Credits
*/
//Includes
//Defines
#define dcmd(%1,%2,%3) if ((strcmp((%3)[1], #%1, true, (%2)) == 0) && ((((%3)[(%2) + 1] == 0) && (dcmd_%1(playerid, "")))||(((%3)[(%2) + 1] == 32) && (dcmd_%1(playerid, (%3)[(%2) + 2]))))) return 1
#include <a_samp>
#include <float>
#include <file>
#include <YSI_Objects>
#define MAX_RACECHECKPOINTS 64
#define MAX_BUILDERS 4
#define RACEFILE_VERSION 2
#define MENUSYSTEM
//colors
#define COLOR_GREY 0xBEBEBEAA
#define COLOR_WHITE 0xFFFFFFAA
#define COLOR_GREEN 0x33AA33AA
#define COLOR_GRAD5 0xE3E3E3FF
#define COLOR_GRAD1 0xB4B5B7FF
#define COLOR_DRIFT 0xE3E3E3FF
#define COLOR_RACE 0xBEBEBEAA
#define COLOR_TUNE 0x000000AA
#define COLOR_RED 0xAA3333AA
#define COLOR_YELLOW 0xFFFF00AA
#define COLOR_GREEN 0x33AA33AA
#define COLOR_WHITE 0xFFFFFFAA
#define COLOR_STUNT 0x00FFFFAA
//pragmas
#pragma tabsize 0
//new
//The Mission´s
new Float:VehCP[3][3] =   //[3] = amount of coords  [3] = size of string
 {
    {-1046.6548,448.9770,14.5396},
    {2784.0300,-2416.5308,13.6346},
    {-2029.8876,157.2540,28.8359}
 };
//Other
new MajorityDelay = 120;
new RRotation = 0;
new RRotationDelay = 600000;
new BuildAdmin = 1; 
new RaceAdmin = 1;  
new PrizeMode=0;       
new Prize=30000;        
new DynaMP=1;          
new JoinFee=1000;
new currentveh;
new gPlayerLogged[MAX_PLAYERS];
new gPlayerAccount[MAX_PLAYERS];
new Pot=0;              
new Ranking;           
new PrizeMP;           
new Countdown;          
new cd;                
new MajStart=0;        
new MajStartTimer;      
new mscd;             
new RaceActive;        
new RaceStart;          
new Float:RaceCheckpoints[MAX_RACECHECKPOINTS][3];  
new LCurrentCheckpoint;                            
new CurrentCheckpoint[MAX_PLAYERS];              
new CurrentLap[MAX_PLAYERS];                       
new RaceParticipant[MAX_PLAYERS];                  
new Participants;                                   
new PlayerVehicles[MAX_PLAYERS];                    
new ORacelaps, ORacemode;   
new OAirrace, Float:OCPsize;
new Racelaps, Racemode;		
new ScoreChange;           
new RaceTick;               
new LastLapTick[MAX_PLAYERS];
new TopRacers[6][MAX_PLAYER_NAME]; 
new TopRacerTimes[6];              
new TopLappers[6][MAX_PLAYER_NAME];
new TopLapTimes[6];               
new Float:CPsize;                        
new Airrace;                       
new Float:RLenght, Float:LLenght; 
new BCurrentCheckpoints[MAX_BUILDERS];              
new RaceBuilders[MAX_PLAYERS];                     
new BuilderSlots[MAX_BUILDERS];                     
new Float:BRaceCheckpoints[MAX_BUILDERS][MAX_RACECHECKPOINTS][3]; 
new Bracemode[MAX_BUILDERS];
new Blaps[MAX_BUILDERS];
new Float:BCPsize[MAX_BUILDERS];
new BAirrace[MAX_BUILDERS];
//The Count
new Count = 5;
new CountText[5][5] ={
"~g~1",
"~y~2",
"~r~3",
"~r~4",
"~r~5"
};
#if defined MENUSYSTEM
forward RefreshMenuHeader(playerid,Menu:menu,text[]);
new Menu:MAdmin, Menu:MPMode, Menu:MPrize, Menu:MDyna, Menu:MBuild, Menu:MLaps;
new Menu:MRace, Menu:MRacemode, Menu:MFee, Menu:MCPsize, Menu:MDelay;
#endif
//Forward
forward CountDown();
forward ShowStats(playerid,targetid);
forward OnPlayerUpdate(playerid);
forward Encrypt(string[]);
forward OnPlayerLogin(playerid,const string[]);
forward PayDay (playerid);
forward RaceRotation();
forward LockRacers();
forward UnlockRacers();
forward SaveScores();   				
forward GetRaceTick(playerid);			
forward GetLapTick(playerid); 		 
forward ReadyRefresh();      	  		
forward RaceSound(playerid,sound);      
forward BActiveCP(playerid,sele);       
forward endrace();                     
forward countdown();                    
forward mscountdown();
forward SetNextCheckpoint(playerid);    
forward CheckBestLap(playerid, laptime);	
forward CheckBestRace(playerid,racetime);   
forward ChangeLap(playerid);
forward SetRaceCheckpoint(playerid,target,next);   
forward SetBRaceCheckpoint(playerid,target,next);   
forward LoadTimes(playerid,timemode,tmp[]);     
forward IsNotAdmin(playerid);          
forward GetBuilderSlot(playerid);   
forward b(playerid); 		       
forward Float:Distance(Float:x1,Float:y1,Float:z1,Float:x2,Float:y2,Float:z2);
forward clearrace(playerid);
forward startrace();
forward LoadRace(tmp[]);
forward CreateRaceMenus();
new ystring[128];
new CBuilder[MAX_PLAYER_NAME], CFile[64], CRaceName[128];
new RotationTimer;

enum pInfo
{
	pPassword[128],
	pKills,
	pDeaths,
	pCash,
};
new PlayerInfo[MAX_PLAYERS][pInfo];
//------------------------------------------------------------------------------
main()
{
	print("\n----------------------------------");
	print(" Drift/Race/Tune/Stunt GM");
	print(" By: Splitx");
	print("Thx To: Kevin433 For Login/Register System");
	print("----------------------------------\n");
}
//------------------------------------------------------------------------------
public OnGameModeInit()
{
	SetGameModeText("Drift/Race/Tune/Stunt"); // The Game mode name
	AllowAdminTeleport(1); // Allow! The Rcon ADMIN To Tp via The Map
	ShowNameTags(1);
	ShowPlayerMarkers(1);
	SetWorldTime(12); // The Time
	UsePlayerPedAnims(); //This Is For CJ´s Run Style
		RaceActive=0;
	Ranking=1;
	LCurrentCheckpoint=0;
	Participants=0;
	for(new i;i<MAX_BUILDERS;i++)
	{
	    BuilderSlots[i]=MAX_PLAYERS+1;
	}
	if(RRotation != -1) SetTimer("RaceRotation",RRotationDelay,1);
	#if defined MENUSYSTEM
		CreateRaceMenus();
		#endif
	//Payday
	SetTimer("PayDay", 300000,1);
	//Classes
//Team Drift
AddPlayerClass(108,1240.0455,-2037.1292,59.9424,264.1106,0,0,0,0,0,0);
AddPlayerClass(123,1240.0455,-2037.1292,59.9424,264.1106,0,0,0,0,0,0);
//Team Tune
AddPlayerClass(115,-2694.6809,229.2315,4.3359,284.4549,0,0,0,0,0,0);
AddPlayerClass(188,-2694.6809,229.2315,4.3359,284.4549,0,0,0,0,0,0);
//Team Race
AddPlayerClass(247,1240.0455,-2037.1292,59.9424,264.1106,0,0,0,0,0,0);
AddPlayerClass(181,1396.1069,-2509.1196,13.5547,239.4767,0,0,0,0,0,0);
//Team Stunt
AddPlayerClass(101,1698.6154,1608.4980,10.7019,105.3526,0,0,0,0,0,0);
AddPlayerClass(100,1698.6154,1608.4980,10.7019,105.3526,0,0,0,0,0,0);
//Cars
//Race Cars
AddStaticVehicle(451,1397.9125,-2518.2009,13.2528,267.5043,36,36); // RaceCar
AddStaticVehicle(451,1398.0685,-2514.0159,13.2561,271.0031,125,125); // RaceCar
AddStaticVehicle(415,1397.8141,-2522.0728,13.3178,269.4274,40,1); // RaceCar
AddStaticVehicle(415,1397.8174,-2526.2612,13.3179,271.7157,62,1); // RaceCar
AddStaticVehicle(411,1397.8837,-2531.2397,13.2740,271.8963,64,1); // RaceCar
AddStaticVehicle(411,1397.8503,-2536.6169,13.2740,271.4503,123,1); // RaceCar
AddStaticVehicle(402,1398.0322,-2540.7202,13.3785,269.3202,22,22); // RaceCar
AddStaticVehicle(402,1397.8870,-2545.4836,13.3786,268.7772,30,30); // RaceCar
AddStaticVehicle(411,434.4354,2487.6829,16.1927,91.0787,123,1); // car Dessert Ap
AddStaticVehicle(411,433.8886,2492.2461,16.2171,88.0609,116,1); // car Dessert Ap
AddStaticVehicle(415,434.0526,2498.2852,16.2627,89.4243,40,1); // car Dessert Ap
AddStaticVehicle(415,434.3282,2503.9727,16.2616,88.8173,62,1); // car Dessert Ap
AddStaticVehicle(451,433.8639,2510.0225,16.2002,85.9235,36,36); // car Dessert Ap
AddStaticVehicle(451,433.8287,2515.7344,16.2402,87.0963,16,16); // car Dessert Ap
//Drift Cars
AddStaticVehicle(603,1244.7191,-2043.7236,59.7027,267.6138,75,77); // Drift car
AddStaticVehicle(603,1244.7743,-2039.3174,59.7028,269.6292,18,1); // Drift car
AddStaticVehicle(562,1244.4263,-2035.0356,59.5318,272.3605,35,1); // Drift car
AddStaticVehicle(562,1244.4778,-2031.8578,59.5294,269.7017,17,1); // Drift car
AddStaticVehicle(494,1244.8781,-2027.5726,59.7547,267.3006,36,13); // Drift car
AddStaticVehicle(494,1244.8787,-2024.1432,59.7542,269.0692,42,30); // Drift car
AddStaticVehicle(415,1244.7257,-2020.2172,59.6344,272.3509,25,1); // Drift car
AddStaticVehicle(415,1244.7291,-2016.3115,59.6306,271.3358,36,1); // Drift car
AddStaticVehicle(415,2308.8079,1387.7050,42.5921,0.9302,92,1); // Car Drift Place 2
AddStaticVehicle(562,2305.7244,1387.7603,42.4792,0.2820,11,1); // Car Drift Place 2
AddStaticVehicle(562,2302.2944,1387.4388,42.4810,3.3863,116,1); // Car Drift Place 2
AddStaticVehicle(494,2299.2241,1387.7865,42.7157,358.6081,42,33); // Car Drift Place 2
AddStaticVehicle(494,2295.3511,1387.8523,42.7154,358.5255,54,36); // Car Drift Place 2
AddStaticVehicle(415,2312.5159,1387.3010,42.5930,359.2944,75,1); // Car Drift Place 2
AddStaticVehicle(562,-2416.8879,-588.7526,132.3090,216.2498,92,1); // Drift Place 3
AddStaticVehicle(562,-2414.1951,-587.5865,132.3074,215.7954,92,1); // Drift Place 3
AddStaticVehicle(562,-2411.7129,-585.3605,132.3084,215.6292,92,1); // Drift Place 3
AddStaticVehicle(562,-2409.1533,-583.5892,132.3092,214.5522,92,1); // Drift Place 3
AddStaticVehicle(415,-2399.7788,-612.9139,132.4193,36.6766,0,1); // Drift Place 3
AddStaticVehicle(415,-2397.1777,-611.6749,132.4204,34.7285,0,1); // Drift Place 3
AddStaticVehicle(415,-2394.7380,-609.5941,132.4189,36.0448,0,1); // Drift Place 3
AddStaticVehicle(415,-2392.1421,-608.1600,132.4194,32.9267,0,1); // Drift Place 3
AddStaticVehicle(494,-2396.1489,-594.1603,132.5437,125.9284,75,79); // Drift Place 3
AddStaticVehicle(494,-2394.7021,-597.8128,132.5439,126.6801,75,79); // Drift Place 3
AddStaticVehicle(494,-2398.3345,-592.3273,132.5437,125.1606,75,79); // Drift Place 3
AddStaticVehicle(494,-2400.5339,-590.1197,132.5438,125.3016,75,79); // Drift Place 3
AddStaticVehicle(562,-345.7710,1515.4310,75.0191,0.8900,35,1); // Car big ear
AddStaticVehicle(562,-339.8235,1514.9597,75.0188,1.1072,35,1); // Car big ear
AddStaticVehicle(562,-333.4804,1516.0933,75.0176,0.2676,35,1); // Car big ear
AddStaticVehicle(494,-327.3193,1515.8364,75.2547,359.7574,36,13); // Car big ear
AddStaticVehicle(494,-321.0045,1514.9034,75.2540,359.1989,36,13); // Car big ear
AddStaticVehicle(494,-314.8265,1516.4387,75.2522,1.9450,36,13); // Car big ear
AddStaticVehicle(415,-264.9444,1542.9677,75.1286,133.0805,36,1); // Car big ear
AddStaticVehicle(415,-270.8604,1546.9063,75.1320,136.5329,36,1); // Car big ear
AddStaticVehicle(415,-275.0788,1552.5321,75.1323,136.5559,36,1); // Car big ear
AddStaticVehicle(411,-280.1234,1557.6625,75.0864,134.6831,64,1); // Car big ear
AddStaticVehicle(411,-285.1519,1562.3802,75.0865,133.3128,64,1); // Car big ear
//Tune Cars
AddStaticVehicle(562,-2693.1997,238.1145,3.9956,269.7431,113,1); // TuneCar
AddStaticVehicle(562,-2692.9773,234.3783,3.9960,270.1290,101,1); // TuneCar
AddStaticVehicle(558,-2693.1082,229.5907,3.9664,269.0911,116,1); // TuneCar
AddStaticVehicle(558,-2683.6304,236.4099,3.9662,184.8736,117,1); // TuneCar
AddStaticVehicle(559,-2680.1694,236.8950,3.9923,187.2038,58,8); // TuneCar
AddStaticVehicle(559,-2675.8523,236.7651,3.9923,181.7573,60,1); // TuneCar
AddStaticVehicle(560,-2660.5483,230.3254,4.0427,60.9345,9,39); // TuneCar
AddStaticVehicle(560,-2659.9221,233.8745,4.0410,90.5287,17,1); // TuneCar
AddStaticVehicle(561,-2660.2234,237.0837,4.1520,91.1869,8,17); // TuneCar
//Stunt Cars
AddStaticVehicle(522,1714.0773,1592.4402,9.8178,97.6158,1,1); // nrg
AddStaticVehicle(522,1714.1119,1588.6697,9.9631,93.8279,1,1); // nrg
AddStaticVehicle(522,1713.9835,1585.1272,10.0985,85.6056,1,1); // nrg
AddStaticVehicle(522,1713.6199,1580.8899,10.2090,83.7569,1,1); // nrg
AddStaticVehicle(522,1713.2813,1576.6313,10.2903,84.8411,1,1); // nrg
AddStaticVehicle(522,1713.0928,1573.0151,10.3553,79.3453,1,1); // nrg
AddStaticVehicle(522,1724.5016,1626.4858,9.0802,64.1138,1,1); // nrg
AddStaticVehicle(522,1726.5542,1632.8008,8.8249,78.0478,1,1); // nrg
//Drag Race Strip
Object_Object();
CreateDynamicObject(982, 405.318695, 2527.653320, 16.230694, 0, 0, 270);
CreateDynamicObject(982, 380.819702, 2528.905518, 16.249596, 0, 0, 270);
CreateDynamicObject(982, 354.721710, 2529.565674, 16.384201, 0, 0, 270);
CreateDynamicObject(982, 330.945251, 2528.549072, 16.460026, 0, 0, 270);
CreateDynamicObject(982, 304.640717, 2528.460449, 16.486961, 0, 0, 270);
CreateDynamicObject(982, 277.232025, 2528.328125, 16.483177, 0, 0, 270);
CreateDynamicObject(982, 250.646362, 2528.259033, 16.461681, 0, 0, 270);
CreateDynamicObject(982, 224.465286, 2528.273926, 16.468399, 0, 0, 270);
CreateDynamicObject(982, 195.737411, 2528.251709, 16.487808, 0, 0, 270);
CreateDynamicObject(982, 164.521179, 2528.305420, 16.477245, 0, 0, 270);
CreateDynamicObject(982, 138.152710, 2528.233887, 16.480915, 0, 0, 270);
CreateDynamicObject(982, 110.364799, 2528.030029, 16.487957, 0, 0, 270);
CreateDynamicObject(982, 83.098862, 2527.993652, 16.186619, 0, 0, 270);
CreateDynamicObject(982, 56.125954, 2528.029785, 16.167931, 0, 0, 270);
CreateDynamicObject(982, 29.113401, 2527.978760, 16.167931, 0, 0, 270);
CreateDynamicObject(982, 3.415903, 2527.964600, 16.175739, 0, 0, 270);
CreateDynamicObject(982, -23.517525, 2528.014404, 16.167931, 0, 0, 270);
CreateDynamicObject(982, -49.779373, 2528.057373, 16.167931, 0, 0, 270);
CreateDynamicObject(3749, -65.074387, 2506.527588, 21.342789, 0, 0, 270);
CreateDynamicObject(7033, 412.852814, 2502.627441, 19.998146, 0, 0, 90);
CreateDynamicObject(978, 420.394226, 2483.387451, 16.324594, 0, 0, 281.25);
CreateDynamicObject(979, 418.790405, 2522.165771, 16.324594, 0, 0, 270);
CreateDynamicObject(979, -44.702377, 2524.828613, 16.324594, 0, 0, 213.75);
CreateDynamicObject(979, -52.039368, 2518.351318, 16.332403, 0, 0, 225);
CreateDynamicObject(978, -55.828346, 2492.251709, 16.324593, 0, 0, 303.75);
CreateDynamicObject(978, -49.746178, 2483.450684, 16.324594, 0, 0, 303.75);
CreateDynamicObject(982, -48.252487, 2477.401367, 16.167931, 0, 0, 90);
CreateDynamicObject(982, -21.082066, 2477.391602, 16.175739, 0, 0, 90);
CreateDynamicObject(982, 7.023036, 2477.704834, 16.167931, 0, 0, 90);
CreateDynamicObject(982, 32.933624, 2477.620117, 16.167931, 0, 357.4217, 90);
CreateDynamicObject(982, 59.499825, 2477.490479, 16.167931, 0, 357.4217, 90);
CreateDynamicObject(982, 85.643349, 2477.413574, 16.167931, 0, 357.4217, 90);
CreateDynamicObject(982, 112.543182, 2477.289795, 16.167931, 0, 357.4217, 90);
CreateDynamicObject(982, 138.923401, 2477.740723, 16.167931, 0, 357.4217, 90);
CreateDynamicObject(982, 167.141678, 2477.699951, 16.167931, 0, 357.4217, 90);
CreateDynamicObject(982, 194.368790, 2477.729248, 16.175724, 0, 357.4217, 90);
CreateDynamicObject(982, 221.267700, 2477.654541, 16.167931, 0, 357.4217, 90);
CreateDynamicObject(982, 247.612213, 2477.465820, 16.167931, 0, 357.4217, 90);
CreateDynamicObject(982, 275.808960, 2477.282471, 16.167931, 0, 357.4217, 90);
CreateDynamicObject(982, 302.723694, 2476.875977, 16.167931, 0, 357.4217, 90);
CreateDynamicObject(982, 329.806458, 2476.768311, 16.175724, 0, 357.4217, 90);
CreateDynamicObject(982, 356.567841, 2476.671143, 16.167931, 0, 357.4217, 90);
CreateDynamicObject(982, 384.229370, 2476.770996, 16.167931, 0, 357.4217, 90);
CreateDynamicObject(982, 410.105774, 2476.810303, 16.175724, 0, 357.4217, 90);
CreateDynamicObject(3279, 363.345520, 2473.303711, 15.559992, 0, 0, 0);
CreateDynamicObject(3279, 359.301300, 2538.250000, 15.769968, 0, 0, 0);
CreateDynamicObject(3279, 266.567200, 2537.323486, 15.888117, 0, 0, 0);
CreateDynamicObject(3279, 263.311401, 2470.236816, 15.552179, 0, 0, 0);
CreateDynamicObject(3279, 181.998199, 2534.185547, 15.835125, 0, 0, 0);
CreateDynamicObject(3279, 172.727600, 2471.180420, 15.559994, 0, 0, 0);
CreateDynamicObject(3279, -0.682999, 2534.356689, 15.559992, 0, 0, 0);
CreateDynamicObject(3279, -6.891918, 2468.754150, 15.559992, 0, 0, 0);
CreateDynamicObject(3666, 396.533813, 2502.635742, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, 388.533356, 2502.684570, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, 383.849823, 2502.698730, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, 376.320496, 2502.804932, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, 368.718414, 2503.032227, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, 361.100037, 2503.173096, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, 352.108551, 2503.020752, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, 344.854706, 2503.676025, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, 335.013123, 2504.084473, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, 323.361694, 2503.778320, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, 311.208435, 2503.615967, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, 300.337921, 2503.355469, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, 283.540497, 2503.066650, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, 263.516052, 2503.019043, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, 246.964996, 2502.832275, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, 225.123718, 2502.413574, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, 202.336548, 2503.051025, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, 181.712097, 2502.624756, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, 168.177002, 2502.661133, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, 159.526733, 2502.710205, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, 148.141510, 2502.825684, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, 213.532349, 2502.804932, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, 134.841705, 2502.816406, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, 111.035614, 2502.842529, 16.005869, 0, 0, 0);
CreateDynamicObject(3666, 100.596153, 2502.887695, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, 89.089645, 2502.746826, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, 74.795349, 2502.987061, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, 60.741280, 2503.218994, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, 47.077271, 2503.279785, 15.998062, 0, 0, 0);
CreateDynamicObject(3666, 26.273666, 2503.354980, 16.005869, 0, 0, 0);
CreateDynamicObject(3666, 12.728344, 2503.508545, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, 12.699739, 2506.864014, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, 11.238373, 2499.578857, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, 12.326128, 2509.974609, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, 10.962069, 2496.583008, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, 122.070885, 2503.451416, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, 191.211502, 2502.748291, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, -39.907104, 2526.375488, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, -42.003525, 2524.434082, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, -43.930252, 2522.406494, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, -46.787964, 2520.242432, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, -52.634880, 2514.371826, 16.005869, 0, 0, 0);
CreateDynamicObject(3666, -50.591316, 2516.571777, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, -48.765289, 2518.703857, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, -56.190468, 2496.530518, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, -55.037926, 2494.890625, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, -53.808891, 2492.928955, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, -52.471565, 2490.452637, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, -46.400932, 2481.624756, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, -47.693520, 2483.154785, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, -48.853256, 2484.464111, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, -50.331924, 2486.273682, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, -62.138374, 2500.659424, 15.998060, 0, 0, 0);
CreateDynamicObject(3666, -62.439896, 2512.101807, 16.005869, 0, 0, 0);
//Stunt ZOne
CreateDynamicObject(1634, 1477.882080, 1207.438843, 11.117630, 0.0000, 0.0000, 180.0000);
CreateDynamicObject(1634, 1477.857056, 1203.463135, 14.641050, 24.0642, 0.0000, 180.0000);
CreateDynamicObject(1634, 1477.865234, 1201.007813, 19.322962, 46.4095, 0.0000, 180.0000);
CreateDynamicObject(1634, 1477.878784, 1199.927490, 24.744240, 60.1605, 0.0000, 180.0000);
CreateDynamicObject(1634, 1477.903320, 1200.207886, 31.430532, 73.9115, 0.8594, 180.0000);
CreateDynamicObject(1634, 1477.828247, 1201.490234, 36.473537, 86.8030, 0.8594, 180.0000);
CreateDynamicObject(4168, 1478.146729, 1275.121948, 32.991570, 0.0000, 0.0000, 270.0000);
CreateDynamicObject(1634, 1478.209229, 1344.856812, 33.973713, 0.0000, 0.0000, 0.0000);
CreateDynamicObject(1634, 1478.186279, 1349.698975, 37.681175, 19.7670, 0.0000, 0.0000);
CreateDynamicObject(1634, 1478.189697, 1353.017090, 41.889687, 34.3775, 0.0000, 0.0000);
CreateDynamicObject(1634, 1478.179932, 1355.062500, 46.554382, 48.1284, 0.0000, 0.0000);
CreateDynamicObject(1634, 1478.162354, 1356.145874, 51.975304, 58.4416, 0.0000, 0.0000);
CreateDynamicObject(1634, 1478.176147, 1356.233154, 57.727669, 69.6143, 0.0000, 0.0000);
CreateDynamicObject(1634, 1478.187622, 1355.321045, 62.648430, 80.7870, 0.0000, 0.0000);
CreateDynamicObject(4168, 1478.308716, 1281.223389, 58.338135, 0.0000, 0.0000, 270.0000);
CreateDynamicObject(1634, 1478.171631, 1215.489624, 59.549492, 0.0000, 0.0000, 180.0000);
CreateDynamicObject(1634, 1478.139526, 1211.973877, 63.196587, 26.6425, 0.0000, 180.0000);
CreateDynamicObject(1634, 1478.106201, 1210.535522, 67.426888, 48.9878, 0.0000, 180.0000);
CreateDynamicObject(1634, 1478.137329, 1209.611572, 72.593910, 61.0199, 0.0000, 180.0000);
CreateDynamicObject(1634, 1478.126831, 1209.805664, 78.252747, 73.9115, 0.0000, 180.0000);
CreateDynamicObject(4168, 1478.170898, 1289.272339, 82.114304, 0.0000, 0.0000, 90.0000);
CreateDynamicObject(1634, 1478.172241, 1211.047607, 83.179230, 85.0842, 0.0000, 180.0000);
CreateDynamicObject(4168, 1478.270264, 1424.086426, 87.224632, 0.0000, 355.7028, 90.0000);
CreateDynamicObject(4168, 1478.273682, 1558.704468, 109.587738, 0.0000, 345.3896, 90.0000);
CreateDynamicObject(4168, 1478.179199, 1688.066895, 153.640091, 0.0000, 336.7952, 90.0000);
CreateDynamicObject(4168, 1478.079590, 1822.360962, 182.304977, 0.0000, 359.1406, 90.0000);
CreateDynamicObject(6342, 1468.813110, 1976.265137, 50.646446, 1.7189, 291.2451, 236.9550);
CreateDynamicObject(4168, 1481.945557, 1929.096069, 122.880646, 348.8273, 61.8794, 116.6423);
CreateDynamicObject(970, 1470.675171, 1892.041748, 183.968781, 0.0000, 0.0000, 0.0000);
CreateDynamicObject(970, 1475.070313, 1892.139404, 183.817642, 0.0000, 0.0000, 0.0000);
CreateDynamicObject(970, 1477.330322, 1889.887329, 183.799225, 0.0000, 0.0000, 270.0000);
CreateDynamicObject(972, 1474.192261, 1871.541016, 182.954193, 0.0000, 0.0000, 0.0000);
CreateDynamicObject(972, 1471.020264, 1847.138184, 182.619888, 0.0000, 0.0000, 347.9679);
CreateDynamicObject(971, 1486.861816, 1895.290771, 183.404205, 86.8030, 359.1406, 180.0000);
CreateDynamicObject(6342, 1468.267090, 1979.177612, 48.172829, 353.9839, 297.2612, 247.8184);
CreateDynamicObject(971, 1461.637695, 2004.728516, 14.593355, 122.8994, 206.1607, 287.0745);
CreateDynamicObject(6342, 1410.175659, 2006.473389, 42.900719, 323.9037, 327.3415, 296.3335);
CreateDynamicObject(6342, 1369.836792, 2003.086304, 58.486191, 305.8555, 342.8113, 324.6176);
CreateDynamicObject(1634, 1342.251953, 1993.718872, 94.457382, 38.6747, 313.5905, 114.7692);
CreateDynamicObject(1634, 1341.604370, 1991.512085, 98.281235, 54.1445, 310.1527, 131.9580);
CreateDynamicObject(1634, 1342.151855, 1989.475708, 102.714050, 66.1766, 289.5262, 153.4441);
CreateDynamicObject(4168, 1418.136597, 1985.515015, 102.290016, 0.0000, 0.0000, 0.0000);
CreateDynamicObject(2780, 1487.065430, 1994.478638, 102.358528, 0.0000, 0.0000, 0.0000);
CreateDynamicObject(2780, 1487.359253, 1976.245483, 102.352531, 0.0000, 0.0000, 180.0000);
CreateDynamicObject(2780, 1487.163696, 1979.995239, 102.352531, 0.0000, 0.0000, 180.0000);
CreateDynamicObject(2780, 1487.836914, 1990.967163, 102.357315, 0.0000, 0.0000, 0.0000);
CreateDynamicObject(1225, 1487.472534, 1989.868652, 102.609810, 0.0000, 0.0000, 0.0000);
CreateDynamicObject(1225, 1480.801025, 1991.884155, 102.609810, 0.0000, 0.0000, 0.0000);
CreateDynamicObject(1225, 1480.973877, 1991.526978, 102.609810, 0.0000, 0.0000, 0.0000);
CreateDynamicObject(1225, 1481.249634, 1990.964355, 102.609810, 0.0000, 0.0000, 0.0000);
CreateDynamicObject(1225, 1481.577637, 1990.095215, 102.609810, 0.0000, 0.0000, 0.0000);
CreateDynamicObject(1225, 1481.752930, 1989.489868, 102.609810, 0.0000, 0.0000, 0.0000);
CreateDynamicObject(1225, 1481.798218, 1988.837891, 102.609810, 0.0000, 0.0000, 0.0000);
CreateDynamicObject(1225, 1481.810791, 1987.678467, 102.609810, 0.0000, 0.0000, 0.0000);
CreateDynamicObject(1225, 1481.755127, 1987.170898, 102.609810, 0.0000, 0.0000, 0.0000);
CreateDynamicObject(1225, 1481.625244, 1986.510620, 102.609810, 0.0000, 0.0000, 0.0000);
CreateDynamicObject(1225, 1481.290527, 1985.497681, 102.609810, 0.0000, 0.0000, 0.0000);
CreateDynamicObject(1225, 1480.804932, 1984.547729, 102.609810, 0.0000, 0.0000, 0.0000);
CreateDynamicObject(1225, 1480.392578, 1983.840820, 102.602020, 0.0000, 0.0000, 0.0000);
CreateDynamicObject(1225, 1479.737427, 1983.072876, 102.602020, 0.0000, 0.0000, 0.0000);
CreateDynamicObject(1225, 1478.968994, 1982.074463, 102.602020, 0.0000, 0.0000, 0.0000);
CreateDynamicObject(1225, 1478.938110, 1981.513306, 102.766083, 0.0000, 0.0000, 0.0000);
CreateDynamicObject(1225, 1478.713013, 1980.759766, 102.766083, 0.0000, 0.0000, 0.0000);
CreateDynamicObject(1225, 1478.587891, 1979.334229, 102.766083, 0.0000, 0.0000, 0.0000);
CreateDynamicObject(1225, 1478.614990, 1978.366699, 102.766083, 0.0000, 0.0000, 0.0000);
CreateDynamicObject(1225, 1482.980957, 1963.268677, 78.782730, 0.0000, 0.0000, 0.0000);
CreateDynamicObject(1225, 1478.484985, 1977.553589, 102.766083, 0.0000, 0.0000, 0.0000);
CreateDynamicObject(2780, 1480.209229, 1993.111206, 102.365318, 0.0000, 0.0000, 0.0000);
CreateDynamicObject(2780, 1480.051025, 1980.346680, 102.360329, 0.0000, 0.0000, 0.0000);
CreateDynamicObject(2780, 1475.922485, 1980.173584, 102.360329, 0.0000, 0.0000, 0.0000);
CreateDynamicObject(2780, 1478.138794, 1994.519043, 102.367538, 0.0000, 0.0000, 0.0000);
CreateDynamicObject(2780, 1487.011230, 1988.310791, 102.204056, 0.0000, 0.0000, 0.0000);
CreateDynamicObject(2780, 1486.895264, 1985.032227, 102.204056, 0.0000, 0.0000, 0.0000);
CreateDynamicObject(2780, 1483.791016, 1989.720093, 102.204056, 0.0000, 0.0000, 0.0000);
CreateDynamicObject(2780, 1483.666260, 1986.157959, 102.204056, 0.0000, 0.0000, 0.0000);
CreateDynamicObject(2780, 1483.662842, 1985.434326, 102.204056, 0.0000, 0.0000, 0.0000);
CreateDynamicObject(1634, 1476.570190, 1839.638306, 11.109818, 0.0000, 0.0000, 0.0000);
CreateDynamicObject(1634, 1476.615723, 1843.823120, 14.325544, 20.6265, 0.0000, 0.0000);
CreateDynamicObject(1634, 1476.638062, 1846.675903, 18.315964, 36.0963, 0.0000, 0.0000);
CreateDynamicObject(1634, 1476.678467, 1848.925293, 23.287676, 44.6907, 0.0000, 0.0000);
CreateDynamicObject(1634, 1476.696533, 1850.161255, 27.966009, 56.7228, 0.0000, 0.0000);
CreateDynamicObject(1634, 1476.792114, 1850.383301, 33.027973, 67.8954, 0.0000, 0.0000);
CreateDynamicObject(1634, 1476.897827, 1849.680298, 38.145294, 77.3492, 0.0000, 0.0000);
CreateDynamicObject(1634, 1476.858765, 1848.184204, 42.891556, 86.8030, 0.0000, 0.0000);
CreateDynamicObject(4168, 1477.386108, 1754.171265, 53.108765, 0.0000, 0.0000, 270.0000);
CreateDynamicObject(1634, 1477.239258, 1660.787720, 11.109818, 0.0000, 0.0000, 0.0000);
CreateDynamicObject(1634, 1571.867798, 1393.061890, 11.145630, 0.0000, 0.0000, 247.5000);
CreateDynamicObject(1634, 1576.654907, 1391.072144, 14.698470, 19.7670, 0.0000, 247.5000);
CreateDynamicObject(1634, 1612.146729, 1409.314209, 21.828461, 3.4377, 0.0000, 348.7500);
CreateDynamicObject(1634, 1613.146362, 1414.286743, 25.627312, 18.9076, 0.0000, 348.7500);
CreateDynamicObject(1634, 1621.582397, 1623.024292, 11.117630, 2.5783, 0.0000, 270.0000);
CreateDynamicObject(1634, 1626.230225, 1623.007813, 14.354559, 16.3293, 0.0000, 270.0000);
CreateDynamicObject(1634, 1480.737549, 1985.409180, 103.493584, 0.0000, 0.0000, 270.0000);
CreateDynamicObject(2780, 1477.333008, 1989.061401, 102.199760, 0.0000, 0.0000, 0.0000);
CreateDynamicObject(2780, 1475.363525, 1982.104126, 102.196266, 0.0000, 0.0000, 0.0000);
CreateDynamicObject(4168, 1582.807495, 1985.307617, 109.345680, 0.0000, 0.0000, 0.0000);
CreateDynamicObject(4168, 1710.889648, 1985.297485, 146.756622, 0.0000, 327.3414, 0.0000);
CreateDynamicObject(4168, 1826.066528, 1985.271973, 224.326782, 0.0000, 324.7631, 0.0000);
CreateDynamicObject(4168, 1940.136597, 1985.287109, 304.890137, 0.0000, 324.7631, 0.0000);
CreateDynamicObject(4168, 2053.960449, 1985.294678, 385.283691, 0.0000, 324.7631, 0.0000);
CreateDynamicObject(4168, 2167.672119, 1985.219849, 465.582306, 0.0000, 324.7631, 0.0000);
CreateDynamicObject(4168, 2280.990967, 1985.229004, 545.613281, 0.0000, 324.7631, 0.0000);
CreateDynamicObject(1634, 1653.582397, 1985.182861, 109.181953, 1.7189, 0.0000, 270.0000);
CreateDynamicObject(4168, 2394.504883, 1985.217773, 625.773071, 0.0000, 324.7631, 0.0000);
CreateDynamicObject(4168, 2508.179688, 1985.236572, 706.055786, 0.0000, 324.7631, 0.0000);
CreateDynamicObject(4168, 2621.977783, 1985.260254, 786.440735, 0.0000, 324.7631, 0.0000);
CreateDynamicObject(4168, 2735.274902, 1985.263550, 866.456055, 0.0000, 324.7631, 0.0000);
CreateDynamicObject(4168, 2846.536621, 1985.189819, 945.042114, 0.0000, 324.7631, 0.0000);
CreateDynamicObject(4168, 2959.043945, 1985.222412, 1024.504761, 0.0000, 324.7631, 0.0000);
CreateDynamicObject(4168, 3072.274902, 1985.240356, 1104.494263, 0.0000, 324.7631, 0.0000);
CreateDynamicObject(4168, 3192.392822, 1985.225830, 1172.664185, 0.0000, 335.9358, 0.0000);
CreateDynamicObject(4168, 3326.308838, 1985.254028, 1200.173828, 0.0000, 0.8594, 0.0000);
CreateDynamicObject(4168, 3435.661621, 1986.902344, 1141.185791, 2.5783, 55.8633, 0.0000);
CreateDynamicObject(4168, 3509.664307, 1992.192017, 1022.902222, 2.5783, 60.1605, 0.0000);
CreateDynamicObject(4168, 3571.549316, 1997.555054, 900.338135, 2.5783, 66.1766, 0.0000);
CreateDynamicObject(4168, 3627.759521, 2003.256104, 773.140930, 2.5783, 66.1766, 0.0000);
CreateDynamicObject(1634, 3654.251221, 2005.614136, 714.630554, 289.5262, 0.0000, 270.0000);
CreateDynamicObject(1634, 3657.047852, 2005.604614, 712.175293, 298.1206, 0.0000, 270.0000);
CreateDynamicObject(1634, 1651.684448, 1985.223511, 108.606918, 347.9679, 0.8594, 270.0000);
	return 1;
}

public OnPlayerRequestClass(playerid, classid)
{

        if(classid == 0)
    {GameTextForPlayer(playerid, "~y~Team Drift", 1000, 3);
         SetPlayerColor(playerid,COLOR_DRIFT);}
        else if(classid == 1)
        {GameTextForPlayer(playerid, "~y~Team Drift", 1000, 3);
     SetPlayerColor(playerid,COLOR_TUNE);}
             else if(classid == 2)
        {GameTextForPlayer(playerid, "~g~Team Tune", 1000, 3);
     SetPlayerColor(playerid,COLOR_TUNE);}
                  else if(classid == 3)
        {GameTextForPlayer(playerid, "~g~Team Tune", 1000, 3);
     SetPlayerColor(playerid,COLOR_TUNE);}
        else if(classid == 4)
        {GameTextForPlayer(playerid, "~r~Team Race", 1000, 3);
         SetPlayerColor(playerid,COLOR_RACE);}
                 else if(classid == 5)
        {GameTextForPlayer(playerid, "~r~Team Race", 1000, 3);
         SetPlayerColor(playerid,COLOR_RACE);}
                 else if(classid == 6)
        {GameTextForPlayer(playerid, "~b~Team Stunt", 1000, 3);
         SetPlayerColor(playerid,COLOR_STUNT);}
                 else if(classid == 7)
        {GameTextForPlayer(playerid, "~b~Team Stunt", 1000, 3);
         SetPlayerColor(playerid,COLOR_STUNT);}
         
         	if(classid == 0)
	{
		SetPlayerPos(playerid, 1177.2856,-2036.8947,69.1484);
		SetPlayerCameraPos(playerid, 1177.285644, -2038.894653, 69.148437);
		SetPlayerCameraLookAt(playerid, 1177.2856,-2036.8947,69.1484);
    }
	return 1;
}

public OnPlayerText(playerid, text[])
{
	for(new i=0; i<256; i++) {
	if (strfind(text[i], "fuck", true) == 0) {
	for(new a=0; a<256; a++) {
	if (a >= i && a < i+strlen("fuck")) text[a]='*';
	}
	}
	}
	for(new i=0; i<256; i++) {
	if (strfind(text[i], "bitch", true) == 0) {
	for(new a=0; a<256; a++) {
	if (a >= i && a < i+strlen("bitch")) text[a]='*';
	}
	}
	}
	for(new i=0; i<256; i++) {
	if (strfind(text[i], "wtf", true) == 0) {
	for(new a=0; a<256; a++) {
	if (a >= i && a < i+strlen("wtf")) text[a]='*';
	}
	}
	}
	for(new i=0; i<256; i++) {
	if (strfind(text[i], "ffs", true) == 0) {
	for(new a=0; a<256; a++) {
	if (a >= i && a < i+strlen("ffs")) text[a]='*';
	}
	}
	}
	for(new i=0; i<256; i++) {
	if (strfind(text[i], "omfg", true) == 0) {
	for(new a=0; a<256; a++) {
	if (a >= i && a < i+strlen("omfg")) text[a]='*';
	}
	}
	}
	return 1;
}

public OnPlayerConnect(playerid)
{
    new pName[MAX_PLAYER_NAME];
    new string[48];
    GetPlayerName(playerid, pName, sizeof(pName));
    format(string, sizeof(string), "(( Server: %s has joined the server. ))", pName);
    SendClientMessageToAll(COLOR_YELLOW, string);
    GameTextForPlayer(playerid,"~r~W~g~e~r~l~g~c~y~o~b~m~y~e",2500,3);
    SendClientMessage(playerid, COLOR_GREEN, "Welcome");
    SendClientMessage(playerid, COLOR_GREEN, "Do");
    SendClientMessage(playerid, COLOR_GREEN, "/help For help /Commands For Commands!");
    SendClientMessage(playerid, COLOR_GREEN, "/credits For credits");
    SendClientMessage(playerid, COLOR_RED, "DM Not Allowd DM = BAN");
    SendClientMessage(playerid, COLOR_RED, "Dont Use Kill This Server is BAD word protected");
    SendClientMessage(playerid, COLOR_GREEN, "Dont have a Account Do /register <password> (only if u want to save ur data)");
    SendClientMessage(playerid, COLOR_GREEN, "Have a Account Do /login <password> (only if u want to save ur data)");
        GivePlayerMoney(playerid, 20000);
        SetPlayerColor(playerid, COLOR_RED);
        return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
Object_OnPlayerDisconnect(playerid, reason);
	if(RaceParticipant[playerid]>=1)
	{
		if(Participants==1) //Last participant leaving, ending race.
		{
			endrace();
		}
		if(RaceParticipant[playerid] < 3 && RaceStart == 0 && !(RaceParticipant[playerid]==3 && RaceStart == 1))
		{ //Doing readycheck since someone left, but not if they disconnected during countdown.
		    ReadyRefresh();
		}
	    Participants--;
	    RaceParticipant[playerid]=0;
	    DisablePlayerRaceCheckpoint(playerid);
	}
	if(RaceBuilders[playerid] != 0)
	{
   	    DisablePlayerRaceCheckpoint(playerid);
	    for(new i;i<BCurrentCheckpoints[b(playerid)];i++)
	    {
	        BRaceCheckpoints[b(playerid)][i][0]=0.0;
   	        BRaceCheckpoints[b(playerid)][i][1]=0.0;
	        BRaceCheckpoints[b(playerid)][i][2]=0.0;
		}
		BuilderSlots[b(playerid)] = MAX_PLAYERS+1;
		RaceBuilders[playerid] = 0;
	}
    new pName[MAX_PLAYER_NAME];
    new string[56];
    GetPlayerName(playerid, pName, sizeof(pName));

    switch(reason)
    {
        case 0: format(string, sizeof(string), "(( Server: %s has left the server. !Timeout! ))", pName);
        case 1: format(string, sizeof(string), "(( Server: %s has left the server. !Leaving! ))", pName);
        case 2: format(string, sizeof(string), "(( Server: %s has left the server. !Kicked! ))", pName);
    }

    SendClientMessageToAll(COLOR_YELLOW, string);
    OnPlayerUpdate(playerid);
    gPlayerLogged[playerid] = 0;
	return 1;
}

public OnPlayerEnterCheckpoint(playerid)
{
if(!IsPlayerInAnyVehicle(playerid)) {
SendClientMessage(playerid, COLOR_YELLOW, "You Are Not in A Car!");
{
else
}
GivePlayerMoney(playerid, 10000);
DisablePlayerCheckpoint(playerid);
SetPlayerHealth(playerid,0);
DestroyVehicle(currentveh);
RemovePlayerFromVehicle(playerid);
GameTextForPlayer(playerid,"~g~$$$$$$$~b~10.000~g~$$$$$$$",2500,5);
	return 1;
}

public OnPlayerDeath(playerid, killerid, reason)
{
GameTextForPlayer(playerid,"~r~DEAD",2000,5);

    new kills = PlayerInfo[playerid][pKills];
    SetPlayerScore(playerid, kills);
    new Float:Health;
    GetPlayerHealth(playerid, Health);
    if(Health == 0.0)
    {
    PlayerInfo[playerid][pDeaths] += 1;
    }
    GivePlayerMoney(killerid,2000);
    PlayerInfo[killerid][pKills] = PlayerInfo[killerid][pKills] + 1;
	return 1;
}

public LockRacers()
{
	for(new i;i<MAX_PLAYERS;i++)
	{
		if(RaceParticipant[i] != 0)
		{
			TogglePlayerControllable(i,0);
			if(IsPlayerInAnyVehicle(i)) PlayerVehicles[i]=GetPlayerVehicleID(i);
			else PlayerVehicles[i]=0;
		}
	}
}

public UnlockRacers()
{
	for(new i;i<MAX_PLAYERS;i++)
	{
		if(RaceParticipant[i]>0)
		{
			TogglePlayerControllable(i,1);
			if(PlayerVehicles[i] != 0)
			{
				PutPlayerInVehicle(i,PlayerVehicles[i],0);
				PlayerVehicles[i]=0;
			}
		}
	}
}

public countdown() {
	if(RaceStart == 0)  // Locking players, setting the reward and
	{
		RaceStart=1;
		LockRacers();
		new tmpprize, OPot;
		OPot=Pot;
		if(PrizeMode == 1 || PrizeMode == 4)
		{
			if(Racemode == 0 || Racemode == 3) tmpprize = floatround(RLenght);
			else if(Racemode == 1) tmpprize = floatround(LLenght * Racelaps);
			else if(Racemode == 2) tmpprize = floatround(RLenght * 2 * Racelaps);
		}
		tmpprize *= DynaMP;
		if(PrizeMode == 0 || PrizeMode == 3) Pot += Prize;
		else if(PrizeMode == 1 || PrizeMode == 4) Pot += tmpprize;
		if(Participants == 1) Pot=OPot; // Only 1 racer, force reward to entrance fees.
	}
	if(cd>0)
	{
		format(ystring, sizeof(ystring), "%d...",cd);
		for(new i=0;i<MAX_PLAYERS;i++)
		{
			if(RaceParticipant[i]>1)
			{
				RaceSound(i,1056);
			    GameTextForPlayer(i,ystring,1000,3);
		    }
	    }
	}
	else if(cd == 0)
	{
		format(ystring, sizeof(ystring), "~g~GO!",cd);
	    KillTimer(Countdown);
		for(new i=0;i<MAX_PLAYERS;i++)
		{
			if(RaceParticipant[i]>1)
			{
				RaceSound(i,1057);
			    GameTextForPlayer(i,ystring,3000,3);
				RaceParticipant[i]=4;
				CurrentLap[i]=1;
				if(Racemode == 3) SetRaceCheckpoint(i,LCurrentCheckpoint,LCurrentCheckpoint-1);
				else SetRaceCheckpoint(i,0,1);
		    }
	    }
		UnlockRacers();
		RaceTick=tickcount();
	}
	cd--;
}

public SetNextCheckpoint(playerid)
{
	if(Racemode == 0) // Default Mode
	{
		CurrentCheckpoint[playerid]++;
		if(CurrentCheckpoint[playerid] == LCurrentCheckpoint)
		{
			SetRaceCheckpoint(playerid,CurrentCheckpoint[playerid],-1);
			RaceParticipant[playerid]=6;
		}
		else SetRaceCheckpoint(playerid,CurrentCheckpoint[playerid],CurrentCheckpoint[playerid]+1);
	}
	else if(Racemode == 1) // Ring Mode
	{
		CurrentCheckpoint[playerid]++;
		if(CurrentCheckpoint[playerid] == LCurrentCheckpoint+1 && CurrentLap[playerid] == Racelaps)
		{
			SetRaceCheckpoint(playerid,0,-1);
			RaceParticipant[playerid]=6;
		}
		else if (CurrentCheckpoint[playerid] == LCurrentCheckpoint+1 && CurrentLap[playerid] != Racelaps)
		{
			CurrentCheckpoint[playerid]=0;
			SetRaceCheckpoint(playerid,0,1);
			RaceParticipant[playerid]=5;
		}
		else if(CurrentCheckpoint[playerid] == 1 && RaceParticipant[playerid]==5)
		{
			ChangeLap(playerid);
			if(LCurrentCheckpoint==1)
			{
				SetRaceCheckpoint(playerid,CurrentCheckpoint[playerid],0);
			}
			else
			{
				SetRaceCheckpoint(playerid,CurrentCheckpoint[playerid],2);
            }
  		    RaceParticipant[playerid]=4;
		}
		else
		{
			if(LCurrentCheckpoint==1 || CurrentCheckpoint[playerid] == LCurrentCheckpoint) SetRaceCheckpoint(playerid,CurrentCheckpoint[playerid],0);
			else SetRaceCheckpoint(playerid,CurrentCheckpoint[playerid],CurrentCheckpoint[playerid]+1);
		}
	}
	else if(Racemode == 2) // Yoyo-mode
	{
		if(RaceParticipant[playerid]==4)
		{
			if(CurrentCheckpoint[playerid] == LCurrentCheckpoint) // @ Last CP, trigger last-1
			{
			    RaceParticipant[playerid]=5;
				CurrentCheckpoint[playerid]=LCurrentCheckpoint-1;
				SetRaceCheckpoint(playerid,CurrentCheckpoint[playerid],CurrentCheckpoint[playerid]-1);
			}
			else if(CurrentCheckpoint[playerid] == LCurrentCheckpoint-1) // Second last CP, set next accordingly
			{
				CurrentCheckpoint[playerid]++;
				SetRaceCheckpoint(playerid,CurrentCheckpoint[playerid],CurrentCheckpoint[playerid]-1);
			}
			else
			{
				CurrentCheckpoint[playerid]++;
				SetRaceCheckpoint(playerid,CurrentCheckpoint[playerid],CurrentCheckpoint[playerid]+1);
			}
		}
		else if(RaceParticipant[playerid]==5)
		{
			if(CurrentCheckpoint[playerid] == 1 && CurrentLap[playerid] == Racelaps) //Set the finish line
			{
				SetRaceCheckpoint(playerid,0,-1);
				RaceParticipant[playerid]=6;
			}
			else if(CurrentCheckpoint[playerid] == 0) //At finish line, change lap.
			{
				ChangeLap(playerid);
				if(LCurrentCheckpoint==1)
				{
					SetRaceCheckpoint(playerid,1,0);
				}
				else
				{
					SetRaceCheckpoint(playerid,1,2);
	            }
	  		    RaceParticipant[playerid]=4;
			}
			else if(CurrentCheckpoint[playerid] == 1)
			{
				CurrentCheckpoint[playerid]--;
				SetRaceCheckpoint(playerid,0,1);
			}
			else
			{
				CurrentCheckpoint[playerid]--;
				SetRaceCheckpoint(playerid,CurrentCheckpoint[playerid],CurrentCheckpoint[playerid]-1);
			}
		}
	}
	else if(Racemode == 3) // Mirror Mode
	{
		CurrentCheckpoint[playerid]--;
		if(CurrentCheckpoint[playerid] == 0)
		{
			SetRaceCheckpoint(playerid,CurrentCheckpoint[playerid],-1);
			RaceParticipant[playerid]=6;
		}
		else
		{
			 SetRaceCheckpoint(playerid,CurrentCheckpoint[playerid],CurrentCheckpoint[playerid]-1);
	    }
	}
}

public SetRaceCheckpoint(playerid,target,next)
{
	if(next == -1 && Airrace == 0) SetPlayerRaceCheckpoint(playerid,1,RaceCheckpoints[target][0],RaceCheckpoints[target][1],RaceCheckpoints[target][2],0.0,0.0,0.0,CPsize);
	else if(next == -1 && Airrace == 1) SetPlayerRaceCheckpoint(playerid,4,RaceCheckpoints[target][0],RaceCheckpoints[target][1],RaceCheckpoints[target][2],0.0,0.0,0.0,CPsize);
	else if(Airrace == 1) SetPlayerRaceCheckpoint(playerid,3,RaceCheckpoints[target][0],RaceCheckpoints[target][1],RaceCheckpoints[target][2],RaceCheckpoints[next][0],
							RaceCheckpoints[next][1],RaceCheckpoints[next][2],CPsize);
	else SetPlayerRaceCheckpoint(playerid,0,RaceCheckpoints[target][0],RaceCheckpoints[target][1],RaceCheckpoints[target][2],RaceCheckpoints[next][0],RaceCheckpoints[next][1],
							RaceCheckpoints[next][2],CPsize);
}
public SetBRaceCheckpoint(playerid,target,next)
{
	new ar = BAirrace[b(playerid)];
	if(next == -1 && ar == 0) SetPlayerRaceCheckpoint(playerid,1,BRaceCheckpoints[b(playerid)][target][0],BRaceCheckpoints[b(playerid)][target][1],
								BRaceCheckpoints[b(playerid)][target][2],0.0,0.0,0.0,BCPsize[b(playerid)]);
	else if(next == -1 && ar == 1) SetPlayerRaceCheckpoint(playerid,4,BRaceCheckpoints[b(playerid)][target][0],
				BRaceCheckpoints[b(playerid)][target][1],BRaceCheckpoints[b(playerid)][target][2],0.0,0.0,0.0,
				BCPsize[b(playerid)]);
	else if(ar == 1) SetPlayerRaceCheckpoint(playerid,3,BRaceCheckpoints[b(playerid)][target][0],BRaceCheckpoints[b(playerid)][target][1],BRaceCheckpoints[b(playerid)][target][2],
						BRaceCheckpoints[b(playerid)][next][0],BRaceCheckpoints[b(playerid)][next][1],BRaceCheckpoints[b(playerid)][next][2],BCPsize[b(playerid)]);
	else SetPlayerRaceCheckpoint(playerid,0,BRaceCheckpoints[b(playerid)][target][0],BRaceCheckpoints[b(playerid)][target][1],BRaceCheckpoints[b(playerid)][target][2],
			BRaceCheckpoints[b(playerid)][next][0],BRaceCheckpoints[b(playerid)][next][1],BRaceCheckpoints[b(playerid)][next][2],BCPsize[b(playerid)]);
}

public GetLapTick(playerid)
{
	new tick, lap;
	tick=tickcount();
	if(CurrentLap[playerid]==1)
	{
		lap=tick-RaceTick;
		LastLapTick[playerid]=tick;
	}
	else
	{
		lap=tick-LastLapTick[playerid];
		LastLapTick[playerid]=tick;
	}
	return lap;
}

public GetRaceTick(playerid)
{
	new tick, race;
	tick=tickcount();
	race=tick-RaceTick;
	return race;
}

public OnPlayerEnterRaceCheckpoint(playerid)
{
	if(RaceParticipant[playerid]>=1) // See if the player is participating in a race, allows race builders to do their stuff in peace.
	{
		if(RaceParticipant[playerid] == 6) // Player reaches the checkered flag.
	    {
			new name[MAX_PLAYER_NAME], LapTime, RaceTime;
			LapTime=GetLapTick(playerid);
			RaceTime=GetRaceTick(playerid);
			GetPlayerName(playerid, name, MAX_PLAYER_NAME);
			RaceParticipant[playerid]=0;
			RaceSound(playerid,1139);
			format(ystring,sizeof(ystring),"%s has finished the race, position: %d",name,Ranking);
			if (Ranking < 4) SendClientMessageToAll(COLOR_GREEN,ystring);
			else SendClientMessage(playerid,COLOR_GREEN,ystring);
			if(Racemode == ORacemode && ORacelaps == Racelaps)
			{
				new	LapString[10],RaceString[10], laprank, racerank;
				LapString=BeHuman(LapTime);
				RaceString=BeHuman(RaceTime);
				format(ystring,sizeof(ystring),"~w~Racetime: %s",RaceString);
				if(ORacemode!=0) format(ystring,sizeof(ystring),"%s~n~Laptime: %s",ystring,LapString);
				laprank=CheckBestLap(playerid,LapTime);
				if(laprank == 1)
				{
				    format(ystring,sizeof(ystring),"%s~n~~y~LAP RECORD!",ystring);
				}
				racerank=CheckBestRace(playerid,RaceTime);
				if(racerank == 1)
				{
				    format(ystring,sizeof(ystring),"%s~n~~y~TRACK RECORD!",ystring);
				}
			    GameTextForPlayer(playerid,ystring,13000,3);
		    }
			if(Ranking<4)
			{
				new winrar;
				if(Ranking == 1 && Participants == 1) winrar=Pot; // If the player was only participant, give the whole pot.
				else if(Ranking == 1 && Participants == 2) winrar=Pot/6*4; // If only 2 participants, give 4/6ths of the pot.
				else winrar=Pot/6*PrizeMP;  // Otherwise 3/6ths, 2/6ths and 1/6th.
				GivePlayerMoney(playerid,winrar);
				format(ystring,sizeof(ystring),"You have earned $%d from the race!",winrar);
				PrizeMP--;
				SendClientMessage(playerid,COLOR_GREEN,ystring);
			}
			Ranking++;
			Participants--;
	        DisablePlayerRaceCheckpoint(playerid);
	        if(Participants == 0)
	        {
	            endrace();
	        }
	    }
	    else if (RaceStart == 0 && RaceParticipant[playerid]==1) // Player arrives to the start CP for 1st time
	    {
			SendClientMessage(playerid,COLOR_YELLOW,"Type /ready when you are ready to start.");
			SendClientMessage(playerid,COLOR_YELLOW,"NOTE: Your controls will be locked once the countdown starts.");
			RaceParticipant[playerid]=2;
	    }
	    else if (RaceStart==1) // Otherwise switch to the next race CP.
	    {
			RaceSound(playerid,1138);
			SetNextCheckpoint(playerid);
	    }
	}
	return 1;
}

public endrace()
{
    SaveScores(); //If the race had already started, and mode & laps are as originally, save the lapscores and racescores.
	for(new i=0;i<LCurrentCheckpoint;i++)
	{
	    RaceCheckpoints[i][0]=0.0;
	    RaceCheckpoints[i][1]=0.0;
	    RaceCheckpoints[i][2]=0.0;
	}
	LCurrentCheckpoint=0;
    for(new i=0;i<MAX_PLAYERS;i++)
    {
		LastLapTick[i]=0;
        DisablePlayerRaceCheckpoint(i);
		if(RaceParticipant[i]==3) //Player was still /ready-locked, unlocking.
		{
				TogglePlayerControllable(i,1);
		        if(PlayerVehicles[i] != 0)
		        {
		            PutPlayerInVehicle(i,PlayerVehicles[i],0);
		            PlayerVehicles[i]=0;
		        }
		}
        RaceParticipant[i]=0;
    }
	RaceActive=0;
	RaceStart=0;
	Participants=0;
	Pot = 0;
	PrizeMP = 3;
    SendClientMessageToAll(COLOR_YELLOW, "The current race has been finished.");
}

public BActiveCP(playerid,sele)
{
	if(BCurrentCheckpoints[b(playerid)]-1 == sele) SetBRaceCheckpoint(playerid,sele,-1);
	else SetBRaceCheckpoint(playerid,sele,sele+1);
}

public RaceSound(playerid,sound)
{
	new Float:x,Float:y,Float:z;
	GetPlayerPos(playerid,x,y,z);
	PlayerPlaySound(playerid,sound,x,y,z);
}

public ReadyRefresh()
{
	if(RaceActive==1) //No countdown if no race is active (could occur with /leave)
	{
		new Waiting=0, Ready=0;
		for(new i=0;i<MAX_PLAYERS;i++)
		{
			if(RaceParticipant[i] == 1 || RaceParticipant[i] == 2) Waiting++;
			else if(RaceParticipant[i] == 3) Ready++;
		}
		if(Waiting==0)
		{
			SendClientMessageToAll(COLOR_GREEN,"Everyone is ready, the race begins!");
			cd=5;
			Countdown = SetTimer("countdown",1000,1);
		}
		else if(Ready >= Waiting && MajorityDelay > 0 && MajStart == 0)
		{
			MajStart=1;
			format(ystring,sizeof(ystring),"Half of the racers are ready, race starts in %d seconds!", MajorityDelay);
			SendClientMessageToAll(COLOR_GREEN,ystring);
			MajStartTimer = SetTimer("mscountdown",10000,1);
			mscd= MajorityDelay;
		}
	}
}

public mscountdown()
{
	if(RaceStart == 1 || MajStart == 0)
	{
		MajStart=0;
		KillTimer(MajStartTimer);
	}
	else
	{
		mscd-=10;
		if(mscd <= 0)
		{
			for(new i;i<MAX_PLAYERS;i++)
			{
				if(RaceParticipant[i] != 3 && RaceParticipant[i] != 0)
				{
					GameTextForPlayer(i,"~r~You didn't make it in time!",6000,3);
					DisablePlayerRaceCheckpoint(i);
					RaceParticipant[i]=0;
					Participants--;
				}
				else if (RaceParticipant[i]!=0) SendClientMessage(i,COLOR_GREEN,"Pre-race countdown done, the race beings!");
			}
			KillTimer(MajStartTimer);
			cd=5;
			Countdown = SetTimer("countdown",1000,1);
		}
		else
		{

			new hurry_string[64];
			format(ystring,sizeof(ystring),"~y~Race starting in ~w~%d~y~ seconds!",mscd);
			format(hurry_string,sizeof(hurry_string),"%s~n~~r~HURRY UP AND /READY",ystring);
			for(new i;i<MAX_PLAYERS;i++)
			{
				if(RaceParticipant[i] < 3 && mscd < 31) GameTextForPlayer(i,hurry_string,6000,3);
				else if(RaceParticipant[i] > 0) GameTextForPlayer(i,ystring,6000,3);
			}
		}
	}
}

public CheckBestLap(playerid,laptime)
{
	if(TopLapTimes[4]<laptime && TopLapTimes[4] != 0 || Racemode == 0)
	{
		return 0;  // If the laptime is more than the previous 5th on the top list, skip to end
	}              // Or the race is gamemode 0 where laps don't really apply
	for(new i;i<5;i++)
	{
	    if(TopLapTimes[i] == 0)
	    {
			new playername[MAX_PLAYER_NAME];
	        GetPlayerName(playerid,playername,MAX_PLAYER_NAME);
	        TopLappers[i]=playername;
	        TopLapTimes[i]=laptime;
			ScoreChange=1;
			return i+1;
	    }
		else if(TopLapTimes[i] > laptime)
		{
		    for(new j=4;j>=i;j--)
		    {
		        TopLapTimes[j+1]=TopLapTimes[j];
		        TopLappers[j+1]=TopLappers[j];
		    }
			new playername[MAX_PLAYER_NAME];
	        GetPlayerName(playerid,playername,MAX_PLAYER_NAME);
		    TopLapTimes[i]=laptime;
			TopLappers[i]=playername;
			ScoreChange=1;
			return i+1;
		}
	}
	return -1; //Shouldn't get here.
}

public CheckBestRace(playerid,racetime)
{
	if(TopRacerTimes[4]<racetime && TopRacerTimes[4] != 0) return 0;
	for(new i;i<5;i++)
	{
	    if(TopRacerTimes[i] == 0)
	    {
			new playername[MAX_PLAYER_NAME];
	        GetPlayerName(playerid,playername,MAX_PLAYER_NAME);
	        TopRacers[i]=playername;
	        TopRacerTimes[i]=racetime;
			ScoreChange=1;
			return i+1;
	    }
		else if(TopRacerTimes[i] > racetime)
		{
		    for(new j=4;j>=i;j--)
		    {
		        TopRacerTimes[j+1]=TopRacerTimes[j];
		        TopRacers[j+1]=TopRacers[j];
		    }
			new playername[MAX_PLAYER_NAME];
	        GetPlayerName(playerid,playername,MAX_PLAYER_NAME);
		    TopRacerTimes[i]=racetime;
			TopRacers[i]=playername;
			ScoreChange=1;
			return i+1;
		}
	}
	return -1; //Shouldn't get here.
}

public SaveScores()
{
	if(ScoreChange == 1)
	{
		fremove(CFile);
		new File:f,Float:x,Float:y,Float:z, templine[512];
		f = fopen(CFile,io_write);
		format(templine,sizeof(templine),"YRACE %d %s %d %d %d %f\n", RACEFILE_VERSION, CBuilder, ORacemode, ORacelaps, OAirrace, OCPsize);
		fwrite(f,templine);
		format(templine,sizeof(templine),"%s %d %s %d %s %d %s %d %s %d\n",
				TopRacers[0],TopRacerTimes[0],TopRacers[1], TopRacerTimes[1], TopRacers[2],TopRacerTimes[2],
	 			TopRacers[3],TopRacerTimes[3],TopRacers[4], TopRacerTimes[4]);
		fwrite(f,templine);
		format(templine,sizeof(templine),"%s %d %s %d %s %d %s %d %s %d\n",
				TopLappers[0],TopLapTimes[0],TopLappers[1], TopLapTimes[1], TopLappers[2],TopLapTimes[2],
	 			TopLappers[3],TopLapTimes[3],TopLappers[4], TopLapTimes[4]);
		fwrite(f,templine);
		for(new i = 0; i < LCurrentCheckpoint+1;i++)
		{
			x=RaceCheckpoints[i][0];
			y=RaceCheckpoints[i][1];
			z=RaceCheckpoints[i][2];
			format(templine,sizeof(templine),"%f %f %f\n",x,y,z);
			fwrite(f,templine);
		}
		fclose(f);
	}
	ScoreChange=0;
}
public ChangeLap(playerid)
{
	new LapTime, TimeString[10], checklap;
	LapTime=GetLapTick(playerid);
	TimeString=BeHuman(LapTime);
	format(ystring,sizeof(ystring),"~w~Lap %d/%d - time: %s", CurrentLap[playerid], Racelaps, TimeString);
	if(Racemode == ORacemode && ORacelaps == Racelaps)
	{
		checklap=CheckBestLap(playerid,LapTime);
		if(checklap==1) format(ystring,sizeof(ystring),"%s~n~~y~LAP RECORD!",ystring);
	}
	CurrentLap[playerid]++;
	if(CurrentLap[playerid] == Racelaps) format(ystring,sizeof(ystring),"%s~n~~g~Final lap!",ystring);
	GameTextForPlayer(playerid,ystring,6000,3);
}

BeHuman(ticks)
{
	new HumanTime[10], minutes, seconds, secstring[2], msecstring[3];
	minutes=ticks/60000;
	ticks=ticks-(minutes*60000);
	seconds=ticks/1000;
	ticks=ticks-(seconds*1000);
	if(seconds <10) format(secstring,sizeof(secstring),"0%d",seconds);
	else format(secstring,sizeof(secstring),"%d",seconds);
	format(HumanTime,sizeof(HumanTime),"%d:%s",minutes,secstring);
	if(ticks < 10) format(msecstring,sizeof(msecstring),"00%d", ticks);
	else if(ticks < 100) format(msecstring,sizeof(msecstring),"0%d",ticks);
	else format(msecstring,sizeof(msecstring),"%d",ticks);
	format(HumanTime,sizeof(HumanTime),"%s.%s",HumanTime,msecstring);
	return HumanTime;
}

public LoadTimes(playerid,timemode,tmp[])
{
	new temprace[67], idx;
	format(temprace,sizeof(temprace),"%s.yr",tmp);
    if(strlen(tmp))
    {
		if(!fexist(temprace))
		{
			format(ystring,sizeof(ystring),"Race \'%s\' doesn't exist!",tmp);
			SendClientMessage(playerid,COLOR_YELLOW,ystring);
			return 1;
		}
		else
		{
			new File:f, templine[256], TBuilder[MAX_PLAYER_NAME], TempLapper[MAX_PLAYER_NAME], TempLap;
			idx=0;
			f = fopen(temprace, io_read);
			fread(f,templine,sizeof(templine)); // Read header-line
			if(templine[0] == 'Y') //Checking if the racefile is v0.2+
			{
				new fileversion;
			    strtok(templine,idx); // read off YRACE
				fileversion = strval(strtok(templine,idx)); // read off the file version
				if(fileversion > RACEFILE_VERSION) // Check if the race is made with a newer version of the racefile format
				{
				    format(ystring,sizeof(ystring),"Race \'%s\' is created with a newer version of YRACE, unable to load.",tmp);
				    SendClientMessage(playerid,COLOR_RED,ystring);
				    return 1;
				}
				TBuilder=strtok(templine,idx); // read off RACEBUILDER
				fread(f,templine,sizeof(templine)); // read off best race times
				if(timemode ==1) fread(f,templine,sizeof(templine)); // read off best lap times
				idx=0;
				if(timemode == 0) format(ystring,sizeof(ystring),"%s by %s - Best race times:",tmp,TBuilder);
				else if(timemode == 1) format(ystring,sizeof(ystring),"%s by %s - Best laps:",tmp,TBuilder);
				else return 1;
				SendClientMessage(playerid,COLOR_GREEN,ystring);
				for(new i=0;i<5;i++)
				{
				    TempLapper=strtok(templine,idx);
				    TempLap=strval(strtok(templine,idx));
					if(TempLap == 0)
					{
					    format(ystring,sizeof(ystring),"%d. None yet",i+1);
						i=6;
					}
					else format(ystring,sizeof(ystring),"%d. %s - %s",i+1,BeHuman(TempLap),TempLapper);
					SendClientMessage(playerid,COLOR_GREEN,ystring);
				}
				return 1;
			}
			else
			{
				format(ystring,sizeof(ystring),"Race \'%s\' doesn't contain any time data.",tmp);
				SendClientMessage(playerid,COLOR_GREEN,ystring);
				return 1;
			}
		}
    }
	return 0;
}

public IsNotAdmin(playerid)
{
    if (!IsPlayerAdmin(playerid))
	{
	    SendClientMessage(playerid, COLOR_RED, "You need to be an admin to use this command!");
	    return 1;
    }
    return 0;
}

public GetBuilderSlot(playerid)
{
	for(new i;i < MAX_BUILDERS; i++)
	{
	    if(!(BuilderSlots[i] < MAX_PLAYERS+1))
	    {
	        BuilderSlots[i] = playerid;
	        RaceBuilders[playerid] = i+1;
			return i+1;
	    }
	}
	return 0;
}

public b(playerid) return RaceBuilders[playerid]-1;

public Float:Distance(Float:x1,Float:y1,Float:z1,Float:x2,Float:y2,Float:z2)
{
	new Float:temp=floatsqroot((x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) + (z1-z2) * (z1-z2));
	if(temp < 0) temp=temp*(-1);
	return temp;
}

public clearrace(playerid)
{
	for(new i=0;i<BCurrentCheckpoints[b(playerid)];i++)
	{
		BRaceCheckpoints[b(playerid)][i][0]=0.0;
		BRaceCheckpoints[b(playerid)][i][1]=0.0;
		BRaceCheckpoints[b(playerid)][i][2]=0.0;
	}
	BCurrentCheckpoints[b(playerid)]=0;
	DisablePlayerRaceCheckpoint(playerid);
	SendClientMessage(playerid, COLOR_GREEN, "Your race has been cleared! Use /buildrace to start a new one.");
	BuilderSlots[b(playerid)] = MAX_PLAYERS+1;
	RaceBuilders[playerid]=0;
}

public startrace()
{
	format(ystring,128,"Race \'%s\' is about to start, type /join to join!",CRaceName);
	SendClientMessageToAll(COLOR_GREEN,ystring);
	if(Racemode == 0) format(ystring,sizeof(ystring),"default");
	else if(Racemode == 1) format(ystring,sizeof(ystring),"ring");
	else if(Racemode == 2) format(ystring,sizeof(ystring),"yoyo");
	else if(Racemode == 3) format(ystring,sizeof(ystring),"mirror");
	format(ystring,sizeof(ystring),"Racemode: %s Laps: %d",ystring,Racelaps);
	if(PrizeMode >= 2) format(ystring,sizeof(ystring),"%s Join fee: %d",ystring,JoinFee);
	if(Airrace == 1) format(ystring,sizeof(ystring),"%s AIR RACE",ystring);
	if(Racemode == 0 || Racemode == 3) format(ystring,sizeof(ystring),"%s Track lenght: %0.2fkm", ystring, RLenght/1000);
	else if(Racemode == 1) format(ystring,sizeof(ystring),"%s Lap lenght: %.2fkm, Total: %.2fkm", ystring, LLenght/1000, LLenght * Racelaps / 1000);
	SendClientMessageToAll(COLOR_GREEN,ystring);
	RaceStart=0;
	RaceActive=1;
	ScoreChange=0;
	Ranking=1;
	PrizeMP=3;
}

ReturnModeName(mode)
{
	new modename[8];
	if(mode == 0) modename="Default";
	else if(mode == 1) modename="Ring";
	else if(mode == 2) modename="Yoyo";
	else if(mode == 3) modename="Mirror";
	return modename;
}

public LoadRace(tmp[])
{
	new race_name[32],templine[512];
	format(CRaceName,sizeof(CRaceName), "%s",tmp);
	format(race_name,sizeof(race_name), "%s.yr",tmp);
	if(!fexist(race_name)) return -1; // File doesn't exist
	CFile=race_name;
    LCurrentCheckpoint=-1; RLenght=0; RLenght=0;
	new File:f, i;
	f = fopen(race_name, io_read);
	fread(f,templine,sizeof(templine));
	if(templine[0] == 'Y') //Checking if the racefile is v0.2+
	{
		new fileversion;
	    strtok(templine,i); // read off YRACE
		fileversion = strval(strtok(templine,i)); // read off the file version
		if(fileversion > RACEFILE_VERSION) return -2; // Check if the race is made with a newer version of the racefile format
		CBuilder=strtok(templine,i); // read off RACEBUILDER
		ORacemode = strval(strtok(templine,i)); // read off racemode
		ORacelaps = strval(strtok(templine,i)); // read off amount of laps
		if(fileversion > 1)
		{
			Airrace = strval(strtok(templine,i));   // read off airrace
			CPsize = floatstr(strtok(templine,i));    // read off CP size
		}
		else // v1 file format, set to default
		{
			Airrace = 0;
			CPsize = 8.0;
		}
		OAirrace = Airrace;
		OCPsize = CPsize;
		Racemode=ORacemode; Racelaps=ORacelaps; //Allows changing the modes, but disables highscores if they've been changed.
		fread(f,templine,sizeof(templine)); // read off best race times
		i=0;
		for(new j=0;j<5;j++)
		{
		    TopRacers[j]=strtok(templine,i);
		    TopRacerTimes[j]=strval(strtok(templine,i));
		}
		fread(f,templine,sizeof(templine)); // read off best lap times
		i=0;
		for(new j=0;j<5;j++)
		{
		    TopLappers[j]=strtok(templine,i);
		    TopLapTimes[j]=strval(strtok(templine,i));
		}
	}
	else //Otherwise add the lines as checkpoints, the file is made with v0.1 (or older) version of the script.
	{
		LCurrentCheckpoint++;
		RaceCheckpoints[LCurrentCheckpoint][0] = floatstr(strtok(templine,i));
		RaceCheckpoints[LCurrentCheckpoint][1] = floatstr(strtok(templine,i));
		RaceCheckpoints[LCurrentCheckpoint][2] = floatstr(strtok(templine,i));
		Racemode=0; ORacemode=0; Racelaps=0; ORacelaps=0;   //Enables converting old files to new versions
		CPsize = 8.0; Airrace = 0;  			// v2 additions
		OCPsize = CPsize; OAirrace = Airrace;   // v2 additions
		CBuilder="UNKNOWN";
		for(new j;j<5;j++)
		{
		    TopLappers[j]="A"; TopLapTimes[j]=0; TopRacers[j]="A"; TopRacerTimes[j]=0;
		}
	}
	while(fread(f,templine,sizeof(templine),false))
	{
		LCurrentCheckpoint++;
		i=0;
		RaceCheckpoints[LCurrentCheckpoint][0] = floatstr(strtok(templine,i));
		RaceCheckpoints[LCurrentCheckpoint][1] = floatstr(strtok(templine,i));
		RaceCheckpoints[LCurrentCheckpoint][2] = floatstr(strtok(templine,i));
		if(LCurrentCheckpoint >= 1)
		{
		    RLenght+=Distance(RaceCheckpoints[LCurrentCheckpoint][0],RaceCheckpoints[LCurrentCheckpoint][1],
								RaceCheckpoints[LCurrentCheckpoint][2],RaceCheckpoints[LCurrentCheckpoint-1][0],
								RaceCheckpoints[LCurrentCheckpoint-1][1],RaceCheckpoints[LCurrentCheckpoint-1][2]);
		}
	}
	LLenght = RLenght + Distance(RaceCheckpoints[LCurrentCheckpoint][0],RaceCheckpoints[LCurrentCheckpoint][1],
								RaceCheckpoints[LCurrentCheckpoint][2],RaceCheckpoints[0][0],RaceCheckpoints[0][1],
								RaceCheckpoints[0][2]);
	fclose(f);
	return 1;
}

public RaceRotation()
{
	if(!fexist("yrace.rr"))
	{
	    printf("ERROR in  YRACE's Race Rotation (yrace.rr): yrace.rr doesn't exist!");
	    return -1;
	}

	if(RRotation == -1)
	{
		KillTimer(RotationTimer);
		return -1; // RRotation has been disabled
	}
	if(Participants > 0) return 1; // A race is still active.

	new File:f, templine[32], rotfile[]="yrace.rr", rraces=-1, rracenames[32][32], idx, fback;
	f = fopen(rotfile, io_read);
	while(fread(f,templine,sizeof(templine),false))
	{
		idx = 0;
		rraces++;
		rracenames[rraces]=strtok(templine,idx);
	}
	fclose(f);
	RRotation++;
	if(RRotation > rraces) RRotation = 0;
	fback = LoadRace(rracenames[RRotation]);
	if(fback == -1) printf("ERROR in YRACE's Race Rotation (yrace.rr): Race \'%s\' doesn't exist!",rracenames[RRotation]);
	else if (fback == -2) printf("ERROR in YRACE's Race Rotation (yrace.rr): Race \'%s\' is created with a newer version of YRACE",rracenames[RRotation]);
	else startrace();
	return 1;
}

#if defined MENUSYSTEM
public OnPlayerExitedMenu(playerid)
{
	if(!IsValidMenu(GetPlayerMenu(playerid))) return 1;
	ShowMenuForPlayer(GetPlayerMenu(playerid), playerid);
	return 1;
}

public OnPlayerSelectedMenuRow(playerid, row)
{
	new Menu:Current = GetPlayerMenu(playerid);
	if(Current == MAdmin)
	{
		if(row <=4 && RaceActive == 1)
		{
		    SendClientMessage(playerid,COLOR_RED,"Race active, cannot change this setting!");
			ShowMenuForPlayer(MAdmin,playerid);
		    return 1;
		}
		if(row == 0) ShowMenuForPlayer(MPMode,playerid);
		else if (row == 1) ShowMenuForPlayer(MPrize,playerid);
		else if (row == 2) ShowMenuForPlayer(MDyna,playerid);
		else if (row == 3) ShowMenuForPlayer(MFee,playerid);
		else if (row == 4) ShowMenuForPlayer(MDelay,playerid);
		else if (row == 5)
		{
		    if(RaceActive == 1) endrace();
		    else SendClientMessage(playerid,COLOR_YELLOW,"No race active!");
		    ShowMenuForPlayer(MAdmin,playerid);
		}
		else if (row == 9)
		{
			TogglePlayerControllable(playerid,1);
			HideMenuForPlayer(MAdmin,playerid);
		}
		else
		{
			if(row == 6 && RaceAdmin == 1) RaceAdmin=0;
			else if(row == 6 && RaceAdmin == 0) RaceAdmin=1;
			else if(row == 7 && BuildAdmin == 1) BuildAdmin=0;
			else if(row == 7 && BuildAdmin == 0) BuildAdmin=1;
			else if(row == 8 && RRotation >= 0) RRotation = -1;
			else RRotation = 0;
			if(RaceAdmin == 1) format(ystring,sizeof(ystring),"RA: ON");
			else format(ystring,sizeof(ystring),"RA: off");
			if(BuildAdmin == 1) format(ystring,sizeof(ystring),"%s BA: ON",ystring);
			else format(ystring,sizeof(ystring),"%s BA: off",ystring);
			if(RRotation >= 0) format(ystring,sizeof(ystring),"%s RR: ON",ystring);
			else format(ystring,sizeof(ystring),"%s RR: off",ystring);
			if(RRotation >= 0 && row == 8)  RotationTimer = SetTimer("RaceRotation",RRotationDelay,1);
			else if(RRotation -1 && row == 8) KillTimer(RotationTimer);
			RefreshMenuHeader(playerid,MAdmin,ystring);
		}
	}
	else if(Current == MPMode)
	{
		if(row == 5)
		{
			 ShowMenuForPlayer(MAdmin,playerid);
			 return 1;
		}
		PrizeMode = row;
		if     (PrizeMode == 0) ystring = "Fixed";
		else if(PrizeMode == 1) ystring = "Dynamic";
		else if(PrizeMode == 2) ystring = "Join Fee";
		else if(PrizeMode == 3) ystring = "Join Fee + Fixed";
		else if(PrizeMode == 4) ystring = "Join Fee + Dynamic";
		format(ystring,sizeof(ystring),"Mode: %s",ystring);
		RefreshMenuHeader(playerid,MPMode,ystring);
	}
	else if(Current == MPrize)
	{
	    if(row == 6)
	    {
	        ShowMenuForPlayer(MAdmin,playerid);
	        return 1;
	    }
	    if     (row == 0) Prize += 100;
	    else if(row == 1) Prize += 1000;
	    else if(row == 2) Prize += 10000;
	    else if(row == 3) Prize -= 100;
	    else if(row == 4) Prize -= 1000;
	    else if(row == 5) Prize -= 10000;
	    if(Prize < 0) Prize = 0;
		format(ystring,sizeof(ystring),"Amount: %d",Prize);
		RefreshMenuHeader(playerid,MPrize,ystring);
	}
	else if(Current == MDyna)
	{
		if(row == 4)
		{
		    ShowMenuForPlayer(MAdmin,playerid);
		    return 1;
		}
		if     (row == 0) DynaMP++;
		else if(row == 1) DynaMP+=5;
		else if(row == 2) DynaMP--;
		else if(row == 3) DynaMP-=5;
		else if(DynaMP < 1) DynaMP = 1;
		format(ystring,sizeof(ystring),"Multiplier: %dx",DynaMP);
		RefreshMenuHeader(playerid,MDyna,ystring);
	}
	else if(Current == MBuild)
	{

	    if (row == 0)
		{
			format(ystring,sizeof(ystring),"Laps: %d",Blaps[b(playerid)]);
			SetMenuColumnHeader(MLaps,0,ystring);
			ShowMenuForPlayer(MLaps,playerid);
		}
	    else if (row == 1)
		{
			format(ystring,sizeof(ystring),"Mode: %s",ReturnModeName(Bracemode[b(playerid)]));
			SetMenuColumnHeader(MRacemode,0,ystring);
			ShowMenuForPlayer(MRacemode,playerid);
		}
		else if (row == 2)
		{
		    format(ystring,sizeof(ystring),"Size: %0.2f",BCPsize[b(playerid)]);
		    SetMenuColumnHeader(MCPsize,0,ystring);
		    ShowMenuForPlayer(MCPsize,playerid);
		}
	    else if (row == 3)
	    {
	        if(BAirrace[b(playerid)] == 0)
			{
				BAirrace[b(playerid)] = 1;
				format(ystring,sizeof(ystring),"Air race: ON");
			}
   	        else if(BAirrace[b(playerid)] == 1)
			{
				BAirrace[b(playerid)] = 0;
				format(ystring,sizeof(ystring),"Air race: off");
			}
   	        RefreshMenuHeader(playerid,MBuild,ystring);
	    }
	    else if(row == 4)
	    {
	        clearrace(playerid);
	        HideMenuForPlayer(MBuild,playerid);
	        TogglePlayerControllable(playerid,1);
			return 1;
	    }
	    else if(row == 5)
	    {
	        HideMenuForPlayer(MBuild,playerid);
			TogglePlayerControllable(playerid,1);
	    }
	}
	else if(Current == MLaps)
	{

	    if(row == 6)
	    {
	        if(RaceBuilders[playerid] != 0) ShowMenuForPlayer(MBuild,playerid);
	        else ShowMenuForPlayer(MRace,playerid);
	        return 1;
		}
		new change=0;
	    if     (row == 0) change++;
		else if(row == 1) change+=5;
		else if(row == 2) change+=10;
		else if(row == 3) change--;
		else if(row == 4) change-=5;
		else if(row == 5) change-=10;
		if(RaceBuilders[playerid] != 0)
		{
		    Blaps[b(playerid)] += change;
			if(Blaps[b(playerid)] < 1) Blaps[b(playerid)] = 1;
			format(ystring,sizeof(ystring),"Laps: %d",Blaps[b(playerid)]);
			RefreshMenuHeader(playerid,MLaps,ystring);
		}
		else
		{
			Racelaps += change;
			if(Racelaps < 1) Racelaps = 1;
			format(ystring,sizeof(ystring),"Laps: %d",Racelaps);
			RefreshMenuHeader(playerid,MLaps,ystring);
		}

	}
	else if(Current == MRacemode)
	{
		if(row == 4)
		{
		    if(RaceBuilders[playerid] != 0) ShowMenuForPlayer(MBuild,playerid);
		    else ShowMenuForPlayer(MRace,playerid);
		    return 1;
		}
		if(RaceBuilders[playerid] != 0)
		{
		    Bracemode[b(playerid)]=row;
			if(Bracemode[b(playerid)] == 2 && BCurrentCheckpoints[b(playerid)] < 3)
			{
				SendClientMessage(playerid,COLOR_YELLOW,"Cannot set racemode 2 with only 2 CPs!");
				Bracemode[b(playerid)] = 1;
			}
			format(ystring,sizeof(ystring),"Mode: %s",ReturnModeName(Bracemode[b(playerid)]));
			RefreshMenuHeader(playerid,MRacemode,ystring);
			return 1;
		}
		else
		{
		    Racemode = row;
			if(Racemode == 2 && LCurrentCheckpoint < 2)
			{
				SendClientMessage(playerid,COLOR_YELLOW,"Cannot set racemode 2 with only 2 CPs!");
				Racemode = 1;
			}
			format(ystring,sizeof(ystring),"Mode: %s",ReturnModeName(Racemode));
			RefreshMenuHeader(playerid,MRacemode,ystring);
			return 1;
		}
	}
	else if(Current == MRace)
	{
	    if(row == 0)
		{
			format(ystring,sizeof(ystring),"Laps: %d",Racelaps);
			SetMenuColumnHeader(MLaps,0,ystring);
			ShowMenuForPlayer(MLaps,playerid);
		}
	    else if(row == 1)
		{
			format(ystring,sizeof(ystring),"Mode: %s",ReturnModeName(Racemode));
			SetMenuColumnHeader(MRacemode,0,ystring);
            ShowMenuForPlayer(MRacemode,playerid);
		}
		else if(row == 2)
		{
		    format(ystring,sizeof(ystring),"Size: %0.2f",CPsize);
		    SetMenuColumnHeader(MCPsize,0,ystring);
		    ShowMenuForPlayer(MCPsize,playerid);
		}
	    else if(row == 3)
	    {
	        if(Airrace == 0)
			{
				Airrace = 1;
				format(ystring,sizeof(ystring),"Air race: ON");
			}
			else if(Airrace == 1)
			{
				Airrace = 0;
				format(ystring,sizeof(ystring),"Air race: off");
			}
			RefreshMenuHeader(playerid,MRace,ystring);
	    }
		else if(row == 4)
		{
			if(RaceActive == 0)
			{
				startrace();
		        HideMenuForPlayer(MRace,playerid);
				TogglePlayerControllable(playerid,1);
			}
			else
			{
			    SendClientMessage(playerid,COLOR_YELLOW,"Race is already active!");

			}
		}
		else if(row == 5)
		{
	        HideMenuForPlayer(MRace,playerid);
			TogglePlayerControllable(playerid,1);
		}
	}
	else if(Current == MFee)
	{
	    if(row == 6)
	    {
	        ShowMenuForPlayer(MAdmin,playerid);
	        return 1;
	    }
	    if(row == 0) JoinFee +=100;
	    if(row == 1) JoinFee +=1000;
	    if(row == 2) JoinFee +=10000;
	    if(row == 3) JoinFee -=100;
	    if(row == 4) JoinFee -=1000;
	    if(row == 5) JoinFee -=10000;
	    if(JoinFee < 0) JoinFee = 0;
		format(ystring,sizeof(ystring),"Fee: %d$",JoinFee);
	    RefreshMenuHeader(playerid,MFee,ystring);
	}
	else if(Current == MCPsize)
	{
	    if(row == 6)
	    {
			if(RaceBuilders[playerid] != 0) ShowMenuForPlayer(MBuild,playerid);
			else ShowMenuForPlayer(MRace,playerid);
	        return 1;
	    }
		new Float:change;
	    if(row == 0) change +=0.1;
	    if(row == 1) change +=1.0;
	    if(row == 2) change +=10.0;
		if(row == 3) change -=0.1;
		if(row == 4) change -=1.0;
		if(row == 5) change -=10.0;
		if(RaceBuilders[playerid] != 0)
		{
		    BCPsize[b(playerid)] += change;
			if(BCPsize[b(playerid)] < 1.0) BCPsize[b(playerid)] = 1.0;
			if(BCPsize[b(playerid)] > 32.0) BCPsize[b(playerid)] = 32.0;
			format(ystring,sizeof(ystring),"Size %0.2f",BCPsize[b(playerid)]);
			RefreshMenuHeader(playerid,MCPsize,ystring);
		}
		else
		{
		    CPsize += change;
		    if(CPsize < 1.0) CPsize = 1.0;
		    if(CPsize > 32.0) CPsize = 32.0;
		    format(ystring,sizeof(ystring),"Size %0.2f",CPsize);
		    RefreshMenuHeader(playerid,MCPsize,ystring);
		}
	}
	else if(Current == MDelay)
	{
	    if(row == 4)
	    {
	        ShowMenuForPlayer(MAdmin,playerid);
	        return 1;
	    }
		if      (row == 0) MajorityDelay+=10;
		else if (row == 1) MajorityDelay+=60;
		else if (row == 2) MajorityDelay-=10;
		else if (row == 3) MajorityDelay-=60;
		if(MajorityDelay <= 0)
		{
			MajorityDelay=0;
			format(ystring,sizeof(ystring),"Delay: disabled");
		}
		else format(ystring,sizeof(ystring),"Delay: %ds",MajorityDelay);
		RefreshMenuHeader(playerid,MDelay,ystring);
	}
	return 1;
}

public RefreshMenuHeader(playerid,Menu:menu,text[])
{
	SetMenuColumnHeader(menu,0,text);
	ShowMenuForPlayer(menu,playerid);
}

public CreateRaceMenus()
{
	//Admin menu
	MAdmin = CreateMenu("Admin menu", 1, 25, 170, 220, 25);
	AddMenuItem(MAdmin,0,"Set prizemode...");
	AddMenuItem(MAdmin,0,"Set fixed prize...");
	AddMenuItem(MAdmin,0,"Set dynamic prize...");
	AddMenuItem(MAdmin,0,"Set entry fees...");
	AddMenuItem(MAdmin,0,"Majority delay...");
	AddMenuItem(MAdmin,0,"End current race");
	AddMenuItem(MAdmin,0,"Toggle Race Admin [RA]");
	AddMenuItem(MAdmin,0,"Toggle Build Admin [BA]");
	AddMenuItem(MAdmin,0,"Toggle Race Rotation [RR]");
	AddMenuItem(MAdmin,0,"Leave");
	if(RaceAdmin == 1) format(ystring,sizeof(ystring),"RA: ON");
	else format(ystring,sizeof(ystring),"RA: off");
	if(BuildAdmin == 1) format(ystring,sizeof(ystring),"%s BA: ON",ystring);
	else format(ystring,sizeof(ystring),"%s BA: off",ystring);
	if(RRotation >= 0) format(ystring,sizeof(ystring),"%s RR: ON",ystring);
	else format(ystring,sizeof(ystring),"%s RR: off",ystring);
	SetMenuColumnHeader(MAdmin,0,ystring);
	//Prizemode menu [Admin submenu]
	MPMode = CreateMenu("Set prizemode:", 1, 25, 170, 220, 25);
	AddMenuItem(MPMode,0,"Fixed");
	AddMenuItem(MPMode,0,"Dynamic");
	AddMenuItem(MPMode,0,"Entry Fee");
	AddMenuItem(MPMode,0,"Entry Fee + Fixed");
	AddMenuItem(MPMode,0,"Entry Fee + Dynamic");
	AddMenuItem(MPMode,0,"Back");
	SetMenuColumnHeader(MPMode,0,"Mode: Fixed");
	//Fixed prize menu
	MPrize = CreateMenu("Fixed prize:", 1, 25, 170, 220, 25);
	AddMenuItem(MPrize,0,"+100$");
	AddMenuItem(MPrize,0,"+1000$");
	AddMenuItem(MPrize,0,"+10000$");
	AddMenuItem(MPrize,0,"-100$");
	AddMenuItem(MPrize,0,"-1000$");
	AddMenuItem(MPrize,0,"-10000$");
	AddMenuItem(MPrize,0,"Back");
	format(ystring,sizeof(ystring),"Amount: %d",Prize);
	SetMenuColumnHeader(MPrize,0,ystring);
	//Dynamic prize menu
	MDyna = CreateMenu("Dynamic Prize:", 1, 25, 170, 220, 25);
	AddMenuItem(MDyna,0,"+1x");
	AddMenuItem(MDyna,0,"+5x");
	AddMenuItem(MDyna,0,"-1x");
	AddMenuItem(MDyna,0,"-5x");
	AddMenuItem(MDyna,0,"Leave");
	format(ystring,sizeof(ystring),"Multiplier: %dx",DynaMP);
	SetMenuColumnHeader(MDyna,0,ystring);
	//Build Menu
	MBuild = CreateMenu("Build Menu", 1, 25, 170, 220, 25);
	AddMenuItem(MBuild,0,"Set laps...");
	AddMenuItem(MBuild,0,"Set racemode...");
	AddMenuItem(MBuild,0,"Checkpoint size...");
	AddMenuItem(MBuild,0,"Toggle air race");
	AddMenuItem(MBuild,0,"Clear the race and exit");
	AddMenuItem(MBuild,0,"Leave");
	SetMenuColumnHeader(MBuild,0,"Air race: off");
	//Laps menu
	MLaps = CreateMenu("Set laps", 1, 25, 170, 220, 25);
	AddMenuItem(MLaps,0,"+1");
	AddMenuItem(MLaps,0,"+5");
	AddMenuItem(MLaps,0,"+10");
	AddMenuItem(MLaps,0,"-1");
	AddMenuItem(MLaps,0,"-5");
	AddMenuItem(MLaps,0,"-10");
	AddMenuItem(MLaps,0,"Back");
	//Racemode menu
	MRacemode = CreateMenu("Racemode", 1, 25, 170, 220, 25);
	AddMenuItem(MRacemode,0,"Default");
	AddMenuItem(MRacemode,0,"Ring");
	AddMenuItem(MRacemode,0,"Yoyo");
	AddMenuItem(MRacemode,0,"Mirror");
	AddMenuItem(MRacemode,0,"Back");
	//Race menu
	MRace = CreateMenu("Race Menu", 1, 25, 170, 220, 25);
	AddMenuItem(MRace,0,"Set laps...");
	AddMenuItem(MRace,0,"Set racemode...");
	AddMenuItem(MRace,0,"Set checkpoint size...");
	AddMenuItem(MRace,0,"Toggle air race");
	AddMenuItem(MRace,0,"Start race");
	AddMenuItem(MRace,0,"Abort new race");
	//Entry fee menu
	MFee = CreateMenu("Entry fees", 1, 25, 170, 220, 25);
	AddMenuItem(MFee,0,"+100");
	AddMenuItem(MFee,0,"+1000");
	AddMenuItem(MFee,0,"+10000");
	AddMenuItem(MFee,0,"-100");
	AddMenuItem(MFee,0,"-1000");
	AddMenuItem(MFee,0,"-10000");
	AddMenuItem(MFee,0,"Back");
	format(ystring,sizeof(ystring),"Fee: %d$",JoinFee);
	SetMenuColumnHeader(MFee,0,ystring);
	//CP size menu
	MCPsize = CreateMenu("CP size", 1, 25, 170, 220, 25);
	AddMenuItem(MCPsize,0,"+0.1");
	AddMenuItem(MCPsize,0,"+1");
	AddMenuItem(MCPsize,0,"+10");
	AddMenuItem(MCPsize,0,"-0.1");
	AddMenuItem(MCPsize,0,"-1");
	AddMenuItem(MCPsize,0,"-10");
	AddMenuItem(MCPsize,0,"Back");
	//Majority Delay menu
	MDelay = CreateMenu("Majority Delay", 1, 25, 170, 220, 25);
	AddMenuItem(MDelay,0,"+10s");
	AddMenuItem(MDelay,0,"+60s");
	AddMenuItem(MDelay,0,"-10s");
	AddMenuItem(MDelay,0,"-60s");
	AddMenuItem(MDelay,0,"Back");
	if(MajorityDelay == 0) format(ystring,sizeof(ystring),"Delay: disabled");
	else format(ystring,sizeof(ystring),"Delay: %ds",MajorityDelay);
	SetMenuColumnHeader(MDelay,0,ystring);
}
public OnPlayerCommandText(playerid, cmdtext[])
{
//Ready
if (strcmp(cmdtext, "/ready", true)==0)
{
	new PState=GetPlayerState(playerid);
	if(RaceParticipant[playerid]==2 && PState != PLAYER_STATE_PASSENGER)
	{
		SendClientMessage(playerid,COLOR_GREEN,"You are now ready. Type /ready again to cancel.");
		RaceParticipant[playerid]=3;
		ReadyRefresh();
	}
	else if (RaceParticipant[playerid]==3 && RaceStart==0)
	{
	    SendClientMessage(playerid,COLOR_YELLOW,"You are now not ready. Type /ready when you are.");
	    RaceParticipant[playerid]=2;
	}
	else if (PState == PLAYER_STATE_PASSENGER) SendClientMessage(playerid,COLOR_YELLOW,"You need to be driving for yourself!");
	else if(RaceParticipant[playerid] == 1) SendClientMessage(playerid,COLOR_YELLOW,"You must have visited the starting CP to /ready.");
	else SendClientMessage(playerid,COLOR_YELLOW,"You have not participated in a race.");
    return 1;
}
//Join
if (strcmp(cmdtext, "/join", true)==0)
{
	if(RaceBuilders[playerid] != 0)
	{
	    SendClientMessage(playerid, COLOR_YELLOW, "You are currently building a race, can't join. Use /clearrace to exit build mode.");
	    return 1;
	}
	if(RaceParticipant[playerid]>0)
	{
	    SendClientMessage(playerid, COLOR_YELLOW, "You've already joined the race!");
	}
	else if(RaceActive==1 && RaceStart==0)
	{
		if(PrizeMode >= 2 && GetPlayerMoney(playerid) < JoinFee)
		{
			format(ystring,sizeof(ystring),"You don't have enough money to join the race! (Join fee: %d$)",JoinFee);
			SendClientMessage(playerid, COLOR_YELLOW, ystring);
			return 1;
		}
		else if (PrizeMode >= 2)
		{
			new tempval;
			tempval=(-1)*JoinFee;
		    GivePlayerMoney(playerid,tempval);
		    Pot+=JoinFee;
		}
		CurrentCheckpoint[playerid]=0;
		if(Racemode == 3)
		{
			SetRaceCheckpoint(playerid,LCurrentCheckpoint,LCurrentCheckpoint-1);
			CurrentCheckpoint[playerid]=LCurrentCheckpoint;
		}
		else SetRaceCheckpoint(playerid,0,1);
		RaceParticipant[playerid]=1;
		CurrentLap[playerid]=0;
		SendClientMessage(playerid, COLOR_GREEN, "You have joined the race, go to the start!");
		Participants++;
	}
	else if(RaceActive==1 && RaceStart==1)
	{
	    SendClientMessage(playerid, COLOR_YELLOW, "The race has already started, can't join.");
	}
	else
	{
	    SendClientMessage(playerid, COLOR_YELLOW, "There is no race you can join.");
	}
	return 1;
}

//Stop mission
if (strcmp(cmdtext, "/stop", true)==0)
{
DisablePlayerCheckpoint(playerid);
SendClientMessage(playerid, COLOR_YELLOW, "Mission Stopped Sueccful");
GameTextForPlayer(playerid,"~r~Mission ~y~Stopped ~g~Sueccful",2500,5);
}
if(!strcmp(cmdtext, "/me", true, 3))
{
if(cmdtext[3] == 0) {
SendClientMessage(playerid, 0xFF0000FF, "USAGE: /me [action]");
return 1;
}
new str[128];
GetPlayerName(playerid, str, sizeof(str));
format(str, sizeof(str), "* %s %s", str, cmdtext[4]);
SendClientMessageToAll(0xFFFF00AA, str);
return 1;
}
	if (strcmp(cmdtext, "/count", true)==0)
	{
	if(Count >= 5)
	{
	CountDown();
	return 1;
	}
	else
	{
	SendClientMessage(playerid, 0xFFFF00AA, "An countdown is already running! Wait untill its over first!!");
	return 1;
	}
}
if (strcmp(cmdtext, "/flip", true)==0)
{
new VehicleID, Float:X, Float:Y, Float:Z;
            GetPlayerPos(playerid, X, Y, Z);
  VehicleID = GetPlayerVehicleID(playerid);
  SetVehiclePos(VehicleID, X, Y, Z);
  SetVehicleZAngle(VehicleID, 0);

    return 1;
}
	if(strcmp(cmdtext, "/kill", true) == 0)
	{
	SetPlayerHealth(playerid,0);
	return 1;
	}
//Commands
     if(strcmp(cmdtext, "/commands", true) == 0) {
		SendClientMessage(playerid, COLOR_GREEN, "*********[Commands]***********");
        SendClientMessage(playerid, COLOR_GREEN, "/count /Me <text> /flip /credits /tph /kill /stop /mhelp /Stats");
        return 1;
    }
//Help
    if(strcmp(cmdtext, "/help", true) == 0) {
		SendClientMessage(playerid, COLOR_GREEN, "*********[Help]***********");
		SendClientMessage(playerid, COLOR_GREEN, "/Commands For Commands");
        SendClientMessage(playerid, COLOR_GREEN, "/credits For Credits");
        SendClientMessage(playerid, COLOR_GREEN, "/tph For Tp Commands");
        return 1;
    }
//Credits
    if(strcmp(cmdtext, "/credits", true) == 0) {

		SendClientMessage(playerid, COLOR_GREEN, "*********[CREDITS]***********");
		SendClientMessage(playerid, COLOR_GREEN, "*******Made By: Splitx*******");
        SendClientMessage(playerid, COLOR_GREEN, "*******Drift/Race/Tune/Stunt*******");
        SendClientMessage(playerid, COLOR_GREEN, "*Thx To: Kevin433 For Login/Register System / And Yagu for The Race FS*");
        SendClientMessage(playerid, COLOR_GREEN, "*Thx To Every 1 That Helped Me out!*");
        SendClientMessage(playerid, COLOR_GREEN, "********************************");
        return 1;
    }
        if(strcmp(cmdtext, "/tph", true) == 0) {
		SendClientMessage(playerid, COLOR_GREEN, "*********[TelePortHelp]***********");
        SendClientMessage(playerid, COLOR_GREEN, "/race For Race Tp");
        SendClientMessage(playerid, COLOR_GREEN, "/race2 For Race Tp");
        SendClientMessage(playerid, COLOR_GREEN, "/drift for drift tp");
        SendClientMessage(playerid, COLOR_GREEN, "/drift2 for drift tp");
        SendClientMessage(playerid, COLOR_GREEN, "/drift3 for drift tp");
        SendClientMessage(playerid, COLOR_GREEN, "/drift4 for drift tp");
        SendClientMessage(playerid, COLOR_GREEN, "/tune For Spawn at all cars");
        SendClientMessage(playerid, COLOR_GREEN, "/tunels = Trans frender");
        SendClientMessage(playerid, COLOR_GREEN, "/tunesf = Wheel Arch Angels");
        SendClientMessage(playerid, COLOR_GREEN, "/stunt For Stunt Zone");
        SendClientMessage(playerid, COLOR_GREEN, "********************************");
        return 1;
    }
           if(strcmp(cmdtext, "/mhelp", true) == 0) {
		SendClientMessage(playerid, COLOR_GREEN, "*********[MiSSioN-HeLp]***********");
        SendClientMessage(playerid, COLOR_GREEN, "Every Payday A mission will come! go to The Red marKer *IN* A Car To sell it And u will Get 10.000");
        SendClientMessage(playerid, COLOR_GREEN, "To Stip The Mission Type /stop");
        SendClientMessage(playerid, COLOR_GREEN, "********************************");
        return 1;
    }
    //Drift
if(!strcmp(cmdtext,"/drift",true))
{
    if (GetPlayerState(playerid) == 2)
    {
        new tmpcar = GetPlayerVehicleID(playerid);
	SetVehiclePos(tmpcar, 1253.2285,-2037.4835,59.2695);
    }
    else
    {
    SetPlayerPos(playerid, 1253.2285,-2037.4835,59.2695);
    }
    return 1;
}
//Drift2
if(!strcmp(cmdtext,"/drift2",true))
{
    if (GetPlayerState(playerid) == 2)
    {
        new tmpcar = GetPlayerVehicleID(playerid);
	SetVehiclePos(tmpcar, 2274.8635,1389.8893,42.4733);
    }
    else
    {
    SetPlayerPos(playerid, 2274.8635,1389.8893,42.4733);
    }
    return 1;
}
//DRift3
if(!strcmp(cmdtext,"/drift3",true))
{
    if (GetPlayerState(playerid) == 2)
    {
        new tmpcar = GetPlayerVehicleID(playerid);
	SetVehiclePos(tmpcar, -2411.0278,-607.6990,132.6415);
    }
    else
    {
        SetPlayerPos(playerid, -2411.0278,-607.6990,132.6415);
    }
    return 1;
}
//Drift4
if(!strcmp(cmdtext,"/drift4",true))
{
    if (GetPlayerState(playerid) == 2)
    {
        new tmpcar = GetPlayerVehicleID(playerid);
	SetVehiclePos(tmpcar, -346.4654,1524.0566,75.3473);
    }
    else
    {
    SetPlayerPos(playerid, -346.4654,1524.0566,75.3473);
    }
    return 1;
}
//Tune
if(!strcmp(cmdtext,"/tune",true))
{
    if (GetPlayerState(playerid) == 2)
    {
        new tmpcar = GetPlayerVehicleID(playerid);
	SetVehiclePos(tmpcar, -2667.7813,223.1301,3.8615);
    }
    else
    {
        SetPlayerPos(playerid, -2667.7813,223.1301,3.8615);
    }
    return 1;
}
//Tunels
if(!strcmp(cmdtext,"/tunels",true))
{
    if (GetPlayerState(playerid) == 2)
    {
        new tmpcar = GetPlayerVehicleID(playerid);
	SetVehiclePos(tmpcar, 1039.0768,-1037.3727,31.7109);
    }
    else
    {
    SetPlayerPos(playerid, 1039.0768,-1037.3727,31.7109);
    }
    return 1;
}
//Tunesf
if(!strcmp(cmdtext,"/tunesf",true))
{
    if (GetPlayerState(playerid) == 2)
    {
        new tmpcar = GetPlayerVehicleID(playerid);
	SetVehiclePos(tmpcar, -2702.9797,215.2987,4.1797);
    }
    else
    {
    SetPlayerPos(playerid, -2702.9797,215.2987,4.1797);
    }
    return 1;
}
//Rece
if(!strcmp(cmdtext,"/race",true))
{
    if (GetPlayerState(playerid) == 2)
    {
        new tmpcar = GetPlayerVehicleID(playerid);
	SetVehiclePos(tmpcar, 1396.1069,-2509.1196,13.5547);
    }
    else
    {
    SetPlayerPos(playerid, 1396.1069,-2509.1196,13.5547);
    }
    return 1;
}
//Race2
if(!strcmp(cmdtext,"/race2",true))
{
    if (GetPlayerState(playerid) == 2)
    {
        new tmpcar = GetPlayerVehicleID(playerid);
	SetVehiclePos(tmpcar, 451.4817,2507.4277,19.4912);
    }
    else
    {
    SetPlayerPos(playerid, 451.4817,2507.4277,19.4912);
    }
    return 1;
}
//Stunt
if(!strcmp(cmdtext,"/stunt",true))
{
    if (GetPlayerState(playerid) == 2)
    {
        new tmpcar = GetPlayerVehicleID(playerid);
	SetVehiclePos(tmpcar, 1698.6154,1608.4980,10.7019);
    }
    else
    {
    SetPlayerPos(playerid, 1698.6154,1608.4980,10.7019);
    }
    return 1;
}
//login
    new cmd[256];
    new idx;
    cmd = strtok(cmdtext, idx);
   	new tmp[256];
    new playername[MAX_PLAYER_NAME];
    if (strcmp(cmd, "/login", true) ==0 )
	{
	    if(IsPlayerConnected(playerid))
	    {
	        new tmppass[64];
			if(gPlayerLogged[playerid] == 1)
			{
				SendClientMessage(playerid, COLOR_GREY, "	You are already logged in.");
				return 1;
			}
			tmp = strtok(cmdtext, idx);
			if(!strlen(tmp))
			{
				SendClientMessage(playerid, COLOR_GREY, "	USAGE: /login [password]");
				return 1;
			}
			strmid(tmppass, tmp, 0, strlen(cmdtext), 255);
			Encrypt(tmppass);
			OnPlayerLogin(playerid,tmppass);
		}
		return 1;
	}
	if (strcmp(cmd, "/register", true)==0)
	{
		new string[265];
		tmp = strtok(cmdtext, idx);
		if(!strlen(tmp))
		{
			SendClientMessage(playerid, COLOR_GREY, "USAGE: /register [password]");
			return 1;
		}
		if (gPlayerAccount[playerid] == 1)
		{
			SendClientMessage(playerid, COLOR_GREY, "   That name is already registered");
			return 1;
		}

		strmid(PlayerInfo[playerid][pPassword], tmp, 0, strlen(cmdtext), 255);
		Encrypt(PlayerInfo[playerid][pPassword]);
		GetPlayerName(playerid, playername, sizeof(playername));
		format(string, sizeof(string), "%s.cer", playername);
		new File: file = fopen(string, io_read);
		if (file)
		{
			SendClientMessage(playerid, COLOR_GREY, "   That name is already registered");
			fclose(file);
			return 1;
		}
		new File:hFile;
		hFile = fopen(string, io_append);
		new var[32];//
        format(var, 32, "%s\n", PlayerInfo[playerid][pPassword]);fwrite(hFile, var);
        format(var, 32, "Kills=%d\n",PlayerInfo[playerid][pKills]);fwrite(hFile, var);
        format(var, 32, "Deaths=%d\n",PlayerInfo[playerid][pDeaths]);fwrite(hFile, var);
        PlayerInfo[playerid][pCash] = GetPlayerMoney(playerid);
        format(var, 32, "Money=%d\n",PlayerInfo[playerid][pCash]);fwrite(hFile, var);
		fclose(hFile);
		SendClientMessage(playerid, COLOR_WHITE, "Succesfully Registered!");
		SendClientMessage(playerid, COLOR_WHITE, "Next time you connect, type /login <password> to log in.");
		OnPlayerLogin(playerid,PlayerInfo[playerid][pPassword]);
		return 1;
	}
	if (strcmp(cmd, "/stats", true) == 0)
	{
	    if(IsPlayerConnected(playerid))
	    {
			if (gPlayerLogged[playerid] != 0)
			{
				ShowStats(playerid,playerid);
			}
			else
			{
				SendClientMessage(playerid, COLOR_GRAD1, "   You are not Logged in !");
			}
		}
		return 1;
	}
	return 0;
}

public PayDay(playerid)
{
for (new i; i < MAX_PLAYERS; i++)
{
if (IsPlayerConnected(i))
{
new randomize=random(sizeof(VehCP));
SetPlayerCheckpoint(playerid, VehCP[randomize][0],VehCP[randomize][1],VehCP[randomize][2],30);
SendClientMessage(playerid, COLOR_YELLOW, "Hint: Go to the Checkpoint To sell The car Do /stop To Stop the mission");
GivePlayerMoney(i, 10000);
GameTextForPlayer(i,"~g~PAY~r~DAY ~b~10.000", 2500, 3);
SendClientMessage(playerid, COLOR_GREEN, "*********[PaYDaY]***********");
SendClientMessage(playerid, COLOR_YELLOW, "***********10.000***********");
}
}
}
public CountDown(){
if (Count > 0){
GameTextForAll( CountText[Count-1], 2500, 3);
Count--;
SetTimer("CountDown", 1000, 0);
}
else{
GameTextForAll("~g~Go! Go! Go!", 2500, 3);
Count = 5;
}
return 1;
}
public Encrypt(string[])
{
	for(new x=0; x < strlen(string); x++)
	  {
		  string[x] += (3^x) * (x % 15);
		  if(string[x] > (0xff))
		  {
			  string[x] -= 64;
		  }
	  }
	return 1;
}
public OnPlayerLogin(playerid,const string[])
{
    new pname2[MAX_PLAYER_NAME];
	new pname3[MAX_PLAYER_NAME];
	new string2[64];
	new string3[128];
	GetPlayerName(playerid, pname2, sizeof(pname2));
	format(string2, sizeof(string2), "%s.cer", pname2);
	new File: UserFile = fopen(string2, io_read);

	if (UserFile)
	{
		new valtmp[128];
		fread(UserFile, valtmp);strmid(PlayerInfo[playerid][pPassword], valtmp, 0, strlen(valtmp)-1, 255);

		if ((strcmp(PlayerInfo[playerid][pPassword], string, true, strlen(valtmp)-1) == 0))
		{
			new key[128],val[128];
 			new Data[128];
 			while(fread(UserFile,Data,sizeof(Data)))
			{
				key = ini_GetKey(Data);
                if( strcmp( key , "Kills" , true ) == 0 ) { val = ini_GetValue( Data ); PlayerInfo[playerid][pKills] = strval( val ); }
                if( strcmp( key , "Deaths" , true ) == 0 ) { val = ini_GetValue( Data ); PlayerInfo[playerid][pDeaths] = strval( val ); }
                if( strcmp( key , "Money" , true ) == 0 ) { val = ini_GetValue( Data ); PlayerInfo[playerid][pCash] = strval( val ); }
                GivePlayerMoney(playerid,PlayerInfo[playerid][pCash]);
			}
			fclose(UserFile);
			gPlayerLogged[playerid] = 1;
			gPlayerAccount[playerid] = 1;
		    new kills = PlayerInfo[playerid][pKills];
            SetPlayerScore(playerid, kills);
			GetPlayerName(playerid, pname3, sizeof(pname3));
			format(string3, sizeof(string3), "Welcome %s, you have been succesfully logged in!", pname3);
			SendClientMessage(playerid, COLOR_WHITE,string3);
		}
		else
		{
			SendClientMessage(playerid, COLOR_GREY, "	Password does not match your name");
			fclose(UserFile);
		}
	}
	return 1;
}

public OnPlayerUpdate(playerid)
{
	if(IsPlayerConnected(playerid))
	{
		if(gPlayerLogged[playerid])
		{
			new string3[32];
			new pname3[MAX_PLAYER_NAME];
			GetPlayerName(playerid, pname3, sizeof(pname3));
			format(string3, sizeof(string3), "%s.cer", pname3);
			new File: pFile = fopen(string3, io_write);
			if (pFile)
			{
				new var[32];
				format(var, 32, "%s\n", PlayerInfo[playerid][pPassword]);fwrite(pFile, var);
				fclose(pFile);
				new File: hFile = fopen(string3, io_append);
				PlayerInfo[playerid][pCash] = GetPlayerMoney(playerid);
				format(var, 32, "Kills=%d\n",PlayerInfo[playerid][pKills]);fwrite(hFile, var);
				format(var, 32, "Deaths=%d\n",PlayerInfo[playerid][pDeaths]);fwrite(hFile, var);
				format(var, 32, "Money=%d\n",PlayerInfo[playerid][pCash]);fwrite(hFile, var);
				fclose(hFile);
			}
		}
	}
	return 1;
}

stock ini_GetKey( line[] )
{
	new keyRes[128];
	keyRes[0] = 0;
    if ( strfind( line , "=" , true ) == -1 ) return keyRes;
    strmid( keyRes , line , 0 , strfind( line , "=" , true ) , sizeof( keyRes) );
    return keyRes;
}

stock ini_GetValue( line[] )
{
	new valRes[128];
	valRes[0]=0;
	if ( strfind( line , "=" , true ) == -1 ) return valRes;
	strmid( valRes , line , strfind( line , "=" , true )+1 , strlen( line ) , sizeof( valRes ) );
	return valRes;
}


strtok(const string[], &index)
{
	new length = strlen(string);
	while ((index < length) && (string[index] <= ' '))
	{
		index++;
	}

	new offset = index;
	new result[20];
	while ((index < length) && (string[index] > ' ') && ((index - offset) < (sizeof(result) - 1)))
	{
		result[index - offset] = string[index];
		index++;
	}
	result[index - offset] = EOS;
	return result;
}

public ShowStats(playerid,targetid)
{
    if(IsPlayerConnected(playerid)&&IsPlayerConnected(targetid))
	{
		new cash =  GetPlayerMoney(targetid);
		new deaths = PlayerInfo[targetid][pDeaths];
		new kills = PlayerInfo[targetid][pKills];
		new name[MAX_PLAYER_NAME];
		GetPlayerName(targetid, name, sizeof(name));
		new Float:px,Float:py,Float:pz;
		GetPlayerPos(targetid, px, py, pz);
		new coordsstring[256];
		SendClientMessage(playerid, COLOR_GREEN,"_______________________________________");
		format(coordsstring, sizeof(coordsstring),"*** %s ***",name);
		SendClientMessage(playerid, COLOR_WHITE,coordsstring);
		format(coordsstring, sizeof(coordsstring), "Kills:[%d] Deaths:[%d] Cash:[$%d]",kills,deaths,cash);
		SendClientMessage(playerid, COLOR_GRAD5,coordsstring);
		SendClientMessage(playerid, COLOR_GREEN,"_______________________________________");
	}
}
#endif