Advertisement
Bruno

Sistema de corridas corrigido

Jun 9th, 2012
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 39.41 KB | None | 0 0
  1. #include <a_samp>
  2. #include <dini>
  3. #include <zcmd>
  4.  
  5. #pragma unused \
  6.     ret_memcpy
  7.  
  8. #define ForEach(%0,%1) \
  9.     for(new %0 = 0; %0 != %1; %0++) if(IsPlayerConnected(%0) && !IsPlayerNPC(%0))
  10.  
  11. #define Loop(%0,%1) \
  12.     for(new %0 = 0; %0 != %1; %0++)
  13.  
  14. #define IsOdd(%1) \
  15.     ((%1) & 1)
  16.  
  17. #define ConvertTime(%0,%1,%2,%3,%4) \
  18.     new \
  19.         Float: %0 = floatdiv(%1, 60000) \
  20.     ;\
  21.     %2 = floatround(%0, floatround_tozero); \
  22.     %3 = floatround(floatmul(%0 - %2, 60), floatround_tozero); \
  23.     %4 = floatround(floatmul(floatmul(%0 - %2, 60) - %3, 1000), floatround_tozero)
  24.  
  25. #define function%0(%1) \
  26.     forward%0(%1); public%0(%1)
  27.  
  28. #define MAX_RACE_CHECKPOINTS_EACH_RACE \
  29.     800
  30.  
  31. #define MAX_RACES \
  32.     500
  33.  
  34. #define COUNT_DOWN_TILL_RACE_START \
  35.     30 // seconds
  36.  
  37. #define MAX_RACE_TIME \
  38.     5600 // seconds
  39.  
  40. #define RACE_CHECKPOINT_SIZE \
  41.     10.0
  42.  
  43. #define DEBUG_RACE \
  44.     1
  45.  
  46. //#define RACE_IN_OTHER_WORLD // Uncomment to enable
  47.  
  48. #define GREY \
  49.     0xAFAFAFAA
  50.  
  51. #define GREEN \
  52.     0x9FFF00FF
  53.  
  54. #define RED \
  55.     0xE60000FF
  56.  
  57. #define YELLOW \
  58.     0xFFFF00AA
  59.  
  60. #define WHITE \
  61.     0xFFFFFFAA
  62.  
  63. new
  64.     vNames[212][] =
  65.     {
  66.         {"Landstalker"},
  67.         {"Bravura"},
  68.         {"Buffalo"},
  69.         {"Linerunner"},
  70.         {"Perrenial"},
  71.         {"Sentinel"},
  72.         {"Dumper"},
  73.         {"Firetruck"},
  74.         {"Trashmaster"},
  75.         {"Stretch"},
  76.         {"Manana"},
  77.         {"Infernus"},
  78.         {"Voodoo"},
  79.         {"Pony"},
  80.         {"Mule"},
  81.         {"Cheetah"},
  82.         {"Ambulance"},
  83.         {"Leviathan"},
  84.         {"Moonbeam"},
  85.         {"Esperanto"},
  86.         {"Taxi"},
  87.         {"Washington"},
  88.         {"Bobcat"},
  89.         {"Mr Whoopee"},
  90.         {"BF Injection"},
  91.         {"Hunter"},
  92.         {"Premier"},
  93.         {"Enforcer"},
  94.         {"Securicar"},
  95.         {"Banshee"},
  96.         {"Predator"},
  97.         {"Bus"},
  98.         {"Rhino"},
  99.         {"Barracks"},
  100.         {"Hotknife"},
  101.         {"Trailer 1"},
  102.         {"Previon"},
  103.         {"Coach"},
  104.         {"Cabbie"},
  105.         {"Stallion"},
  106.         {"Rumpo"},
  107.         {"RC Bandit"},
  108.         {"Romero"},
  109.         {"Packer"},
  110.         {"Monster"},
  111.         {"Admiral"},
  112.         {"Squalo"},
  113.         {"Seasparrow"},
  114.         {"Pizzaboy"},
  115.         {"Tram"},
  116.         {"Trailer 2"},
  117.         {"Turismo"},
  118.         {"Speeder"},
  119.         {"Reefer"},
  120.         {"Tropic"},
  121.         {"Flatbed"},
  122.         {"Yankee"},
  123.         {"Caddy"},
  124.         {"Solair"},
  125.         {"Berkley's RC Van"},
  126.         {"Skimmer"},
  127.         {"PCJ-600"},
  128.         {"Faggio"},
  129.         {"Freeway"},
  130.         {"RC Baron"},
  131.         {"RC Raider"},
  132.         {"Glendale"},
  133.         {"Oceanic"},
  134.         {"Sanchez"},
  135.         {"Sparrow"},
  136.         {"Patriot"},
  137.         {"Quad"},
  138.         {"Coastguard"},
  139.         {"Dinghy"},
  140.         {"Hermes"},
  141.         {"Sabre"},
  142.         {"Rustler"},
  143.         {"ZR-350"},
  144.         {"Walton"},
  145.         {"Regina"},
  146.         {"Comet"},
  147.         {"BMX"},
  148.         {"Burrito"},
  149.         {"Camper"},
  150.         {"Marquis"},
  151.         {"Baggage"},
  152.         {"Dozer"},
  153.         {"Maverick"},
  154.         {"News Chopper"},
  155.         {"Rancher"},
  156.         {"FBI Rancher"},
  157.         {"Virgo"},
  158.         {"Greenwood"},
  159.         {"Jetmax"},
  160.         {"Hotring"},
  161.         {"Sandking"},
  162.         {"Blista Compact"},
  163.         {"Police Maverick"},
  164.         {"Boxville"},
  165.         {"Benson"},
  166.         {"Mesa"},
  167.         {"RC Goblin"},
  168.         {"Hotring Racer A"},
  169.         {"Hotring Racer B"},
  170.         {"Bloodring Banger"},
  171.         {"Rancher"},
  172.         {"Super GT"},
  173.         {"Elegant"},
  174.         {"Journey"},
  175.         {"Bike"},
  176.         {"Mountain Bike"},
  177.         {"Beagle"},
  178.         {"Cropdust"},
  179.         {"Stunt"},
  180.         {"Tanker"},
  181.         {"Roadtrain"},
  182.         {"Nebula"},
  183.         {"Majestic"},
  184.         {"Buccaneer"},
  185.         {"Shamal"},
  186.         {"Hydra"},
  187.         {"FCR-900"},
  188.         {"NRG-500"},
  189.         {"HPV1000"},
  190.         {"Cement Truck"},
  191.         {"Tow Truck"},
  192.         {"Fortune"},
  193.         {"Cadrona"},
  194.         {"FBI Truck"},
  195.         {"Willard"},
  196.         {"Forklift"},
  197.         {"Tractor"},
  198.         {"Combine"},
  199.         {"Feltzer"},
  200.         {"Remington"},
  201.         {"Slamvan"},
  202.         {"Blade"},
  203.         {"Freight"},
  204.         {"Streak"},
  205.         {"Vortex"},
  206.         {"Vincent"},
  207.         {"Bullet"},
  208.         {"Clover"},
  209.         {"Sadler"},
  210.         {"Firetruck LA"},
  211.         {"Hustler"},
  212.         {"Intruder"},
  213.         {"Primo"},
  214.         {"Cargobob"},
  215.         {"Tampa"},
  216.         {"Sunrise"},
  217.         {"Merit"},
  218.         {"Utility"},
  219.         {"Nevada"},
  220.         {"Yosemite"},
  221.         {"Windsor"},
  222.         {"Monster A"},
  223.         {"Monster B"},
  224.         {"Uranus"},
  225.         {"Jester"},
  226.         {"Sultan"},
  227.         {"Stratum"},
  228.         {"Elegy"},
  229.         {"Raindance"},
  230.         {"RC Tiger"},
  231.         {"Flash"},
  232.         {"Tahoma"},
  233.         {"Savanna"},
  234.         {"Bandito"},
  235.         {"Freight Flat"},
  236.         {"Streak Carriage"},
  237.         {"Kart"},
  238.         {"Mower"},
  239.         {"Duneride"},
  240.         {"Sweeper"},
  241.         {"Broadway"},
  242.         {"Tornado"},
  243.         {"AT-400"},
  244.         {"DFT-30"},
  245.         {"Huntley"},
  246.         {"Stafford"},
  247.         {"BF-400"},
  248.         {"Newsvan"},
  249.         {"Tug"},
  250.         {"Trailer 3"},
  251.         {"Emperor"},
  252.         {"Wayfarer"},
  253.         {"Euros"},
  254.         {"Hotdog"},
  255.         {"Club"},
  256.         {"Freight Carriage"},
  257.         {"Trailer 3"},
  258.         {"Andromada"},
  259.         {"Dodo"},
  260.         {"RC Cam"},
  261.         {"Launch"},
  262.         {"Police Car (LSPD)"},
  263.         {"Police Car (SFPD)"},
  264.         {"Police Car (LVPD)"},
  265.         {"Police Ranger"},
  266.         {"Picador"},
  267.         {"S.W.A.T. Van"},
  268.         {"Alpha"},
  269.         {"Phoenix"},
  270.         {"Glendale"},
  271.         {"Sadler"},
  272.         {"Luggage Trailer A"},
  273.         {"Luggage Trailer B"},
  274.         {"Stair Trailer"},
  275.         {"Boxville"},
  276.         {"Farm Plow"},
  277.         {"Utility Trailer"}
  278.     },
  279.     BuildRace,
  280.     BuildRaceType,
  281.     BuildVehicle,
  282.     BuildCreatedVehicle,
  283.     BuildModeVID,
  284.     BuildName[30],
  285.     bool: BuildTakeVehPos,
  286.     BuildVehPosCount,
  287.     bool: BuildTakeCheckpoints,
  288.     BuildCheckPointCount,
  289.     RaceBusy = 0x00,
  290.     RaceName[30],
  291.     RaceVehicle,
  292.     RaceType,
  293.     TotalCP,
  294.     Float: RaceVehCoords[2][4],
  295.     Float: CPCoords[MAX_RACE_CHECKPOINTS_EACH_RACE][4],
  296.     CreatedRaceVeh[MAX_PLAYERS],
  297.     Index,
  298.     PlayersCount[2],
  299.     CountTimer,
  300.     CountAmount,
  301.     bool: Joined[MAX_PLAYERS],
  302.     RaceTick,
  303.     RaceStarted,
  304.     CPProgess[MAX_PLAYERS],
  305.     Position,
  306.     FinishCount,
  307.     JoinCount,
  308.     rCounter,
  309.     RaceTime,
  310.     Text: RaceInfo[MAX_PLAYERS],
  311.     InfoTimer[MAX_PLAYERS],
  312.     RacePosition[MAX_PLAYERS],
  313.     RaceNames[MAX_RACES][128],
  314.     TotalRaces,
  315.     bool: AutomaticRace,
  316.     TimeProgress
  317.  
  318. ;
  319.  
  320. public OnFilterScriptExit()
  321. {
  322.     BuildCreatedVehicle = (BuildCreatedVehicle == 0x01) ? (DestroyVehicle(BuildVehicle), BuildCreatedVehicle = 0x00) : (DestroyVehicle(BuildVehicle), BuildCreatedVehicle = 0x00);
  323.     KillTimer(rCounter);
  324.     KillTimer(CountTimer);
  325.     Loop(i, MAX_PLAYERS)
  326.     {
  327.         DisablePlayerRaceCheckpoint(i);
  328.         TextDrawDestroy(RaceInfo[i]);
  329.         DestroyVehicle(CreatedRaceVeh[i]);
  330.         Joined[i] = false;
  331.         KillTimer(InfoTimer[i]);
  332.     }
  333.     JoinCount = 0;
  334.     FinishCount = 0;
  335.     TimeProgress = 0;
  336.     AutomaticRace = false;
  337.     return 1;
  338. }
  339.  
  340. CMD:buildrace(playerid, params[])
  341. {
  342.     if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, RED, "[x] Voce Nao é Um Administrador(a) RCON!");
  343.     if(BuildRace != 0) return SendClientMessage(playerid, RED, "» Voce esta em Modo de Construção !");
  344.     if(RaceBusy == 0x01) return SendClientMessage(playerid, RED, "[x] Espere primeiro até a corrida termina!");
  345.     if(IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, RED, "[x] Por favor, deixe o seu veículo Primeiro!");
  346.     BuildRace = playerid+1;
  347.     ShowDialog(playerid, 599);
  348.     return 1;
  349. }
  350. CMD:startrace(playerid, params[])
  351. {
  352.     if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, RED, "[x] Voce Nao é Um Administrador(a) RCON!");
  353.     if(AutomaticRace == true) return SendClientMessage(playerid, RED, "[x] Não é possível. Corrida automática está ativada !");
  354.     if(BuildRace != 0) return SendClientMessage(playerid, RED, "[x] Há alguém a construção de uma corrida!");
  355.     if(RaceBusy == 0x01 || RaceStarted == 1) return SendClientMessage(playerid, RED, "[x] Há uma Corrida atualmente. Espera primeiro até corrida terminar !");
  356.     if(isnull(params)) return SendClientMessage(playerid, RED, "Use /StartRace [Nome-Da-Corrida]");
  357.     LoadRace(playerid, params);
  358.     return 1;
  359. }
  360. CMD:stoprace(playerid, params[])
  361. {
  362.     if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, RED, "[x] Voce Nao é Um Administrador(a) RCON!");
  363.     if(RaceBusy == 0x00 || RaceStarted == 0) return SendClientMessage(playerid, RED, "[x] Não há nenhuma corrida para parar ");
  364.     SendClientMessageToAll(RED, ">> O(a) Administrador(a) Fechou a Corrida Atual!!");
  365.     SetPlayerPos(playerid, 1242.3445,-1815.5928,14.7578);
  366.     return StopRace();
  367. }
  368. CMD:entrarrace(playerid, params[])
  369. {
  370.     if(RaceStarted == 1) return SendClientMessage(playerid, RED, "Corrida já começou! Espera primeiro até o Fim da corrida!");
  371.     if(RaceBusy == 0x00) return SendClientMessage(playerid, RED, "[x] Não há nenhuma corrida para participar!");
  372.     if(Joined[playerid] == true) return SendClientMessage(playerid, RED, "[x] Você já se juntou a uma corrida!");
  373.     if(IsPlayerInAnyVehicle(playerid)) return SetTimerEx("SetupRaceForPlayer", 2500, 0, "e", playerid), RemovePlayerFromVehicle(playerid), Joined[playerid] = true;
  374.     SetupRaceForPlayer(playerid);
  375.     Joined[playerid] = true;
  376.     return 1;
  377. }
  378. CMD:startautorace(playerid, params[])
  379. {
  380.     if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, RED, "[x] Voce Nao é Um Administrador(a) RCON!");
  381.     if(RaceBusy == 0x01 || RaceStarted == 1) return SendClientMessage(playerid, RED, "[x] Há uma Corrida atualmente. Espera primeiro até corrida termina!");
  382.     if(AutomaticRace == true) return SendClientMessage(playerid, RED, "[x] Já está ativado!");
  383.     LoadRaceNames();
  384.     LoadAutoRace(RaceNames[random(TotalRaces)]);
  385.     AutomaticRace = true;
  386.     SendClientMessage(playerid, GREEN, ">> Você iniciou a corrida Automatica. O filterscript vai começar uma corrida aleatória sempre que a corrida anterior, acabou!");
  387.     return 1;
  388. }
  389. CMD:stopautorace(playerid, params[])
  390. {
  391.     if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, RED, "[x] Voce Nao é Um Administrador(a) RCON!");
  392.     if(AutomaticRace == false) return SendClientMessage(playerid, RED, "[x] Já está ativado!");
  393.     AutomaticRace = false;
  394.     return 1;
  395. }
  396. CMD:exitrace(playerid, params[])
  397. {
  398.     if(Joined[playerid] == true)
  399.     {
  400.         JoinCount--;
  401.         Joined[playerid] = false;
  402.         DestroyVehicle(CreatedRaceVeh[playerid]);
  403.         DisablePlayerRaceCheckpoint(playerid);
  404.         TextDrawHideForPlayer(playerid, RaceInfo[playerid]);
  405.         CPProgess[playerid] = 0;
  406.         SetPlayerPos(playerid, 1242.3445,-1815.5928,14.7578);
  407.         KillTimer(InfoTimer[playerid]);
  408.         TogglePlayerControllable(playerid, true);
  409.         SetCameraBehindPlayer(playerid);
  410.         #if defined RACE_IN_OTHER_WORLD
  411.         SetPlayerVirtualWorld(playerid, 0);
  412.         #endif
  413.     } else return SendClientMessage(playerid, RED, "[x] Você não está em uma corrida!");
  414.     return 1;
  415. }
  416.  
  417. new CarGod[MAX_VEHICLES];
  418.  
  419. CMD:godveiculo(playerid, params[]) {
  420.  
  421.     if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, RED, "[x] Voce Nao é Um Administrador(a) RCON!");
  422.     else {
  423.         SendClientMessage(playerid, 0x9FFF00FF, "[ADMIN] GOD Veiculo LIGADO");
  424.         CarGod[GetPlayerVehicleID(playerid)] = true;
  425.     }
  426.     return 1;
  427. }
  428.  
  429. CMD:godveiculooff(playerid, params[]) {
  430.     if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, RED, "[x] Voce Nao é Um Administrador(a) RCON!");
  431.     else {
  432.         SendClientMessage(playerid, 0xE60000FF, "[ADMIN] GOD Veiculo DESLIGADO");
  433.         CarGod[GetPlayerVehicleID(playerid)] = false;
  434.     }
  435.     return 1;
  436. }
  437.  
  438. public OnVehicleDamageStatusUpdate(vehicleid, playerid) {
  439.     if(CarGod[vehicleid]) RepairVehicle(vehicleid);
  440.     return 1;
  441. }
  442.  
  443.  
  444.  
  445.  
  446.  
  447. public OnPlayerEnterRaceCheckpoint(playerid)
  448. {
  449.     if(CPProgess[playerid] == TotalCP -1)
  450.     {
  451.         new
  452.             TimeStamp,
  453.             TotalRaceTime,
  454.             string[256],
  455.             rFile[256],
  456.             pName[MAX_PLAYER_NAME],
  457.             rTime[3],
  458.             Prize[2],
  459.             TempTotalTime,
  460.             TempTime[3]
  461.         ;
  462.         Position++;
  463.         GetPlayerName(playerid, pName, sizeof(pName));
  464.         SetVehicleHealth(GetPlayerVehicleID(playerid),999999);
  465.         TimeStamp = GetTickCount();
  466.         TotalRaceTime = TimeStamp - RaceTick;
  467.         ConvertTime(var, TotalRaceTime, rTime[0], rTime[1], rTime[2]);
  468.         switch(Position)
  469.         {
  470.             case 1: Prize[0] = (random(random(5000)) + 10000), Prize[1] = 10;
  471.             case 2: Prize[0] = (random(random(4500)) + 9000), Prize[1] = 9;
  472.             case 3: Prize[0] = (random(random(4000)) + 8000), Prize[1] = 8;
  473.             case 4: Prize[0] = (random(random(3500)) + 7000), Prize[1] = 7;
  474.             case 5: Prize[0] = (random(random(3000)) + 6000), Prize[1] = 6;
  475.             case 6: Prize[0] = (random(random(2500)) + 5000), Prize[1] = 5;
  476.             case 7: Prize[0] = (random(random(2000)) + 4000), Prize[1] = 4;
  477.             case 8: Prize[0] = (random(random(1500)) + 3000), Prize[1] = 3;
  478.             case 9: Prize[0] = (random(random(1000)) + 2000), Prize[1] = 2;
  479.             default: Prize[0] = random(random(1000)), Prize[1] = 1;
  480.         }
  481.  
  482.         format(string, sizeof(string), "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", pName, Position);
  483.         SendClientMessageToAll(RED, string);
  484.         format(string, sizeof(string), ">> \"%s\" Venceu a Corida em \"%d\".", pName, Position);
  485.         SendClientMessageToAll(WHITE, string);
  486.         format(string, sizeof(string), "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", pName, Position);
  487.         SendClientMessageToAll(RED, string);
  488.         format(string, sizeof(string), "", rTime[0], rTime[1], rTime[2]);
  489.         SendClientMessageToAll(WHITE, string);
  490.         format(string, sizeof(string), "", Prize[0], Prize[1]);
  491.         SendClientMessageToAll(WHITE, string);
  492.  
  493.         if(FinishCount <= 5)
  494.         {
  495.             format(rFile, sizeof(rFile), "/rRaceSystem/%s.RRACE", RaceName);
  496.             format(string, sizeof(string), "BestRacerTime_%d", TimeProgress);
  497.             TempTotalTime = dini_Int(rFile, string);
  498.             ConvertTime(var1, TempTotalTime, TempTime[0], TempTime[1], TempTime[2]);
  499.             if(TotalRaceTime <= dini_Int(rFile, string) || TempTotalTime == 0)
  500.             {
  501.                 dini_IntSet(rFile, string, TotalRaceTime);
  502.                 format(string, sizeof(string), "BestRacer_%d", TimeProgress);
  503.                 if(TempTotalTime != 0) format(string, sizeof(string), "", pName, dini_Get(rFile, string), -(rTime[1] - TempTime[1]), TimeProgress+1);
  504.                     else format(string, sizeof(string), "", pName, TimeProgress+1);
  505.                 SendClientMessageToAll(GREEN, "  ");
  506.                 SendClientMessageToAll(GREEN, string);
  507.                 SendClientMessageToAll(GREEN, "  ");
  508.                 format(string, sizeof(string), "BestRacer_%d", TimeProgress);
  509.                 dini_Set(rFile, string, pName);
  510.                 TimeProgress++;
  511.             }
  512.         }
  513.         FinishCount++;
  514.         GivePlayerMoney(playerid, Prize[0]);
  515.         SetPlayerScore(playerid, GetPlayerScore(playerid) + Prize[0]);
  516.         DisablePlayerRaceCheckpoint(playerid);
  517.         CPProgess[playerid]++;
  518.         SetPlayerPos(playerid, 1242.3445,-1815.5928,14.7578);
  519.         if(FinishCount >= JoinCount) return StopRace();
  520.     }
  521.     else
  522.     {
  523.         CPProgess[playerid]++;
  524.         CPCoords[CPProgess[playerid]][3]++;
  525.         RacePosition[playerid] = floatround(CPCoords[CPProgess[playerid]][3], floatround_floor);
  526.         SetCP(playerid, CPProgess[playerid], CPProgess[playerid]+1, TotalCP, RaceType);
  527.         PlayerPlaySound(playerid, 1137, 0.0, 0.0, 0.0);
  528.     }
  529.     return 1;
  530. }
  531.  
  532. public OnPlayerDisconnect(playerid)
  533. {
  534.     if(Joined[playerid] == true)
  535.     {
  536.         JoinCount--;
  537.         Joined[playerid] = false;
  538.         DestroyVehicle(CreatedRaceVeh[playerid]);
  539.         DisablePlayerRaceCheckpoint(playerid);
  540.         TextDrawHideForPlayer(playerid, RaceInfo[playerid]);
  541.         CPProgess[playerid] = 0;
  542.         KillTimer(InfoTimer[playerid]);
  543.         #if defined RACE_IN_OTHER_WORLD
  544.         SetPlayerVirtualWorld(playerid, 0);
  545.         #endif
  546.     }
  547.     TextDrawDestroy(RaceInfo[playerid]);
  548.     if(BuildRace == playerid+1) BuildRace = 0;
  549.     return 1;
  550. }
  551.  
  552. public OnPlayerConnect(playerid)
  553. {
  554.     RaceInfo[playerid] = TextDrawCreate(633.000000, 348.000000, " ");
  555.     TextDrawAlignment(RaceInfo[playerid], 3);
  556.     SetVehicleHealth(GetPlayerVehicleID(playerid),999999);
  557.     TextDrawBackgroundColor(RaceInfo[playerid], 255);
  558.     TextDrawFont(RaceInfo[playerid], 1);
  559.     TextDrawLetterSize(RaceInfo[playerid], 0.240000, 1.100000);
  560.     TextDrawColor(RaceInfo[playerid], -687931137);
  561.     TextDrawSetOutline(RaceInfo[playerid], 0);
  562.     TextDrawSetProportional(RaceInfo[playerid], 1);
  563.     TextDrawSetShadow(RaceInfo[playerid], 1);
  564.     return 1;
  565. }
  566.  
  567. public OnPlayerDeath(playerid)
  568. {
  569.     if(Joined[playerid] == true)
  570.     {
  571.         JoinCount--;
  572.         Joined[playerid] = false;
  573.         DestroyVehicle(CreatedRaceVeh[playerid]);
  574.         DisablePlayerRaceCheckpoint(playerid);
  575.         TextDrawHideForPlayer(playerid, RaceInfo[playerid]);
  576.         CPProgess[playerid] = 0;
  577.         KillTimer(InfoTimer[playerid]);
  578.         #if defined RACE_IN_OTHER_WORLD
  579.         SetPlayerVirtualWorld(playerid, 0);
  580.         #endif
  581.     }
  582.     if(BuildRace == playerid+1) BuildRace = 0;
  583.     return 1;
  584. }
  585.  
  586. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
  587. {
  588.     switch(dialogid)
  589.     {
  590.         case 599:
  591.         {
  592.             if(!response) return BuildRace = 0;
  593.             switch(listitem)
  594.             {
  595.                 case 0: BuildRaceType = 0;
  596.                 case 1: BuildRaceType = 3;
  597.             }
  598.             ShowDialog(playerid, 600);
  599.         }
  600.         case 600..601:
  601.         {
  602.             if(!response) return ShowDialog(playerid, 599);
  603.             if(!strlen(inputtext)) return ShowDialog(playerid, 601);
  604.             if(strlen(inputtext) < 1 || strlen(inputtext) > 20) return ShowDialog(playerid, 601);
  605.             strmid(BuildName, inputtext, 0, strlen(inputtext), sizeof(BuildName));
  606.             ShowDialog(playerid, 602);
  607.         }
  608.         case 602..603:
  609.         {
  610.             if(!response) return ShowDialog(playerid, 600);
  611.             if(!strlen(inputtext)) return ShowDialog(playerid, 603);
  612.             if(isNumeric(inputtext))
  613.             {
  614.  
  615.                 if(!IsValidVehicle(strval(inputtext))) return ShowDialog(playerid, 603);
  616.                 new
  617.                     Float: pPos[4]
  618.                 ;
  619.                 GetPlayerPos(playerid, pPos[0], pPos[1], pPos[2]);
  620.                 GetPlayerFacingAngle(playerid, pPos[3]);
  621.                 BuildModeVID = strval(inputtext);
  622.                 BuildCreatedVehicle = (BuildCreatedVehicle == 0x01) ? (DestroyVehicle(BuildVehicle), BuildCreatedVehicle = 0x00) : (DestroyVehicle(BuildVehicle), BuildCreatedVehicle = 0x00);
  623.                 BuildVehicle = CreateVehicle(strval(inputtext), pPos[0], pPos[1], pPos[2], pPos[3], random(126), random(126), (60 * 60));
  624.                 PutPlayerInVehicle(playerid, BuildVehicle, 0);
  625.                 BuildCreatedVehicle = 0x01;
  626.                 ShowDialog(playerid, 604);
  627.             }
  628.             else
  629.             {
  630.                 if(!IsValidVehicle(ReturnVehicleID(inputtext))) return ShowDialog(playerid, 603);
  631.                 new
  632.                     Float: pPos[4]
  633.                 ;
  634.                 GetPlayerPos(playerid, pPos[0], pPos[1], pPos[2]);
  635.                 GetPlayerFacingAngle(playerid, pPos[3]);
  636.                 BuildModeVID = ReturnVehicleID(inputtext);
  637.                 BuildCreatedVehicle = (BuildCreatedVehicle == 0x01) ? (DestroyVehicle(BuildVehicle), BuildCreatedVehicle = 0x00) : (DestroyVehicle(BuildVehicle), BuildCreatedVehicle = 0x00);
  638.                 BuildVehicle = CreateVehicle(ReturnVehicleID(inputtext), pPos[0], pPos[1], pPos[2], pPos[3], random(126), random(126), (60 * 60));
  639.                 PutPlayerInVehicle(playerid, BuildVehicle, 0);
  640.                 BuildCreatedVehicle = 0x01;
  641.                 ShowDialog(playerid, 604);
  642.             }
  643.         }
  644.         case 604:
  645.         {
  646.             if(!response) return ShowDialog(playerid, 602);
  647.             SendClientMessage(playerid, RED, ">> [x] IMPORTANTE: Aperte 'KEY_FIRE' Na Posiçao Local onde Será os Primeiros Lugares da Corrida.");
  648.             SendClientMessage(playerid, RED, " Apos Setar as Posições Voce Continuara a Construção ");
  649.             BuildVehPosCount = 0;
  650.             BuildTakeVehPos = true;
  651.         }
  652.         case 605:
  653.         {
  654.             if(!response) return ShowDialog(playerid, 604);
  655.             SendClientMessage(playerid, RED, ">> Insira os Check-Points Pressionando 'KEY_FIRE' ");
  656.             SendClientMessage(playerid, RED, "   [x] IMPORTANTE: Pressione 'ENTER' Quando Inserir o Ultimo Check-Point Para o a Corrida Construida for Salva e Terminada ");
  657.             BuildCheckPointCount = 0;
  658.             BuildTakeCheckpoints = true;
  659.         }
  660.         case 606:
  661.         {
  662.  
  663.             if(!response) return ShowDialog(playerid, 606);
  664.             BuildRace = 0;
  665.             BuildCheckPointCount = 0;
  666.             BuildVehPosCount = 0;
  667.             BuildTakeCheckpoints = false;
  668.             BuildTakeVehPos = false;
  669.             BuildCreatedVehicle = (BuildCreatedVehicle == 0x01) ? (DestroyVehicle(BuildVehicle), BuildCreatedVehicle = 0x00) : (DestroyVehicle(BuildVehicle), BuildCreatedVehicle = 0x00);
  670.         }
  671.     }
  672.     return 1;
  673. }
  674.  
  675. public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
  676. {
  677.     new
  678.         string[256],
  679.         rNameFile[256],
  680.         rFile[256],
  681.         Float: vPos[4]
  682.     ;
  683.     if(newkeys & KEY_FIRE)
  684.     {
  685.         if(BuildRace == playerid+1)
  686.         {
  687.             if(BuildTakeVehPos == true)
  688.             {
  689.                 if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, RED, "");
  690.                 if(!IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, RED, ">> Voce Prescisa Estar em Um Veiculo");
  691.                 format(rFile, sizeof(rFile), "/rRaceSystem/%s.RRACE", BuildName);
  692.                 GetVehiclePos(GetPlayerVehicleID(playerid), vPos[0], vPos[1], vPos[2]);
  693.                 GetVehicleZAngle(GetPlayerVehicleID(playerid), vPos[3]);
  694.                 dini_Create(rFile);
  695.                 dini_IntSet(rFile, "vModel", BuildModeVID);
  696.                 dini_IntSet(rFile, "rType", BuildRaceType);
  697.                 format(string, sizeof(string), "vPosX_%d", BuildVehPosCount), dini_FloatSet(rFile, string, vPos[0]);
  698.                 format(string, sizeof(string), "vPosY_%d", BuildVehPosCount), dini_FloatSet(rFile, string, vPos[1]);
  699.                 format(string, sizeof(string), "vPosZ_%d", BuildVehPosCount), dini_FloatSet(rFile, string, vPos[2]);
  700.                 format(string, sizeof(string), "vAngle_%d", BuildVehPosCount), dini_FloatSet(rFile, string, vPos[3]);
  701.                 format(string, sizeof(string), ">> Posição Do Veiculo '%d' Setado.", BuildVehPosCount+1);
  702.                 SendClientMessage(playerid, YELLOW, string);
  703.                 BuildVehPosCount++;
  704.             }
  705.             if(BuildVehPosCount >= 2)
  706.             {
  707.                 BuildVehPosCount = 0;
  708.                 BuildTakeVehPos = false;
  709.                 ShowDialog(playerid, 605);
  710.             }
  711.             if(BuildTakeCheckpoints == true)
  712.             {
  713.                 if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, RED, "");
  714.                 if(BuildCheckPointCount > MAX_RACE_CHECKPOINTS_EACH_RACE) return SendClientMessage(playerid, RED, ">> Voce Atingiu o Limite Maximo de Check-Point");
  715.                 if(!IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, RED, ">> Voce Prescisa Estar em Um Veiculo");
  716.                 format(rFile, sizeof(rFile), "/rRaceSystem/%s.RRACE", BuildName);
  717.                 GetVehiclePos(GetPlayerVehicleID(playerid), vPos[0], vPos[1], vPos[2]);
  718.                 format(string, sizeof(string), "CP_%d_PosX", BuildCheckPointCount), dini_FloatSet(rFile, string, vPos[0]);
  719.                 format(string, sizeof(string), "CP_%d_PosY", BuildCheckPointCount), dini_FloatSet(rFile, string, vPos[1]);
  720.                 format(string, sizeof(string), "CP_%d_PosZ", BuildCheckPointCount), dini_FloatSet(rFile, string, vPos[2]);
  721.                 format(string, sizeof(string), ">> Checkpoint '%d' Setado!", BuildCheckPointCount+1);
  722.                 SendClientMessage(playerid, YELLOW, string);
  723.                 BuildCheckPointCount++;
  724.             }
  725.         }
  726.     }
  727.     if(newkeys & KEY_SECONDARY_ATTACK)
  728.     {
  729.         if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, RED, "");
  730.         if(BuildTakeCheckpoints == true)
  731.         {
  732.             ShowDialog(playerid, 606);
  733.             format(rNameFile, sizeof(rNameFile), "/rRaceSystem/RaceNames/RaceNames.txt");
  734.             TotalRaces = dini_Int(rNameFile, "TotalRaces");
  735.             TotalRaces++;
  736.             dini_IntSet(rNameFile, "TotalRaces", TotalRaces);
  737.             format(string, sizeof(string), "Race_%d", TotalRaces-1);
  738.             format(rFile, sizeof(rFile), "/rRaceSystem/%s.RRACE", BuildName);
  739.             dini_Set(rNameFile, string, BuildName);
  740.             dini_IntSet(rFile, "TotalCP", BuildCheckPointCount);
  741.             Loop(x, 5)
  742.             {
  743.                 format(string, sizeof(string), "BestRacerTime_%d", x);
  744.                 dini_Set(rFile, string, "0");
  745.                 format(string, sizeof(string), "BestRacer_%d", x);
  746.                 dini_Set(rFile, string, "noone");
  747.             }
  748.         }
  749.     }
  750.     return 1;
  751. }
  752.  
  753. function LoadRaceNames()
  754. {
  755.     new
  756.         rNameFile[64],
  757.         string[64]
  758.     ;
  759.     format(rNameFile, sizeof(rNameFile), "/rRaceSystem/RaceNames/RaceNames.txt");
  760.     TotalRaces = dini_Int(rNameFile, "TotalRaces");
  761.     Loop(x, TotalRaces)
  762.     {
  763.         format(string, sizeof(string), "Race_%d", x), strmid(RaceNames[x], dini_Get(rNameFile, string), 0, 20, sizeof(RaceNames));
  764.         printf(">> Loaded Races: %s", RaceNames[x]);
  765.     }
  766.     return 1;
  767. }
  768.  
  769. function LoadAutoRace(rName[])
  770. {
  771.     new
  772.         rFile[256],
  773.         string[256]
  774.     ;
  775.     format(rFile, sizeof(rFile), "/rRaceSystem/%s.RRACE", rName);
  776.     if(!dini_Exists(rFile)) return printf("Race \"%s\" doesn't exist!", rName);
  777.     strmid(RaceName, rName, 0, strlen(rName), sizeof(RaceName));
  778.     RaceVehicle = dini_Int(rFile, "vModel");
  779.     RaceType = dini_Int(rFile, "rType");
  780.     TotalCP = dini_Int(rFile, "TotalCP");
  781.  
  782.     #if DEBUG_RACE == 1
  783.     printf("VehicleModel: %d", RaceVehicle);
  784.     printf("RaceType: %d", RaceType);
  785.     printf("TotalCheckpoints: %d", TotalCP);
  786.     #endif
  787.  
  788.     Loop(x, 2)
  789.     {
  790.         format(string, sizeof(string), "vPosX_%d", x), RaceVehCoords[x][0] = dini_Float(rFile, string);
  791.         format(string, sizeof(string), "vPosY_%d", x), RaceVehCoords[x][1] = dini_Float(rFile, string);
  792.         format(string, sizeof(string), "vPosZ_%d", x), RaceVehCoords[x][2] = dini_Float(rFile, string);
  793.         format(string, sizeof(string), "vAngle_%d", x), RaceVehCoords[x][3] = dini_Float(rFile, string);
  794.         #if DEBUG_RACE == 1
  795.         printf("VehiclePos %d: %f, %f, %f, %f", x, RaceVehCoords[x][0], RaceVehCoords[x][1], RaceVehCoords[x][2], RaceVehCoords[x][3]);
  796.         #endif
  797.     }
  798.     Loop(x, TotalCP)
  799.     {
  800.         format(string, sizeof(string), "CP_%d_PosX", x), CPCoords[x][0] = dini_Float(rFile, string);
  801.         format(string, sizeof(string), "CP_%d_PosY", x), CPCoords[x][1] = dini_Float(rFile, string);
  802.         format(string, sizeof(string), "CP_%d_PosZ", x), CPCoords[x][2] = dini_Float(rFile, string);
  803.         #if DEBUG_RACE == 1
  804.         printf("RaceCheckPoint %d: %f, %f, %f", x, CPCoords[x][0], CPCoords[x][1], CPCoords[x][2]);
  805.         #endif
  806.     }
  807.     Position = 0;
  808.     FinishCount = 0;
  809.     JoinCount = 0;
  810.     Loop(x, 2) PlayersCount[x] = 0;
  811.     CountAmount = COUNT_DOWN_TILL_RACE_START;
  812.     RaceTime = MAX_RACE_TIME;
  813.     RaceBusy = 0x01;
  814.     CountTimer = SetTimer("CountTillRace", 999, 1);
  815.     TimeProgress = 0;
  816.     return 1;
  817. }
  818.  
  819. function LoadRace(playerid, rName[])
  820. {
  821.     new
  822.         rFile[256],
  823.         string[256]
  824.     ;
  825.  
  826.     format(rFile, sizeof(rFile), "/rRaceSystem/%s.RRACE", rName);
  827.     if(!dini_Exists(rFile)) return SendClientMessage(playerid, RED, "[x] Corrida Inexistente ! "), printf("Race \"%s\" doesn't exist!", rName);
  828.     strmid(RaceName, rName, 0, strlen(rName), sizeof(RaceName));
  829.     RaceVehicle = dini_Int(rFile, "vModel");
  830.     RaceType = dini_Int(rFile, "rType");
  831.     TotalCP = dini_Int(rFile, "TotalCP");
  832.  
  833.     #if DEBUG_RACE == 1
  834.     printf("VehicleModel: %d", RaceVehicle);
  835.     printf("RaceType: %d", RaceType);
  836.     printf("TotalCheckpoints: %d", TotalCP);
  837.     #endif
  838.  
  839.     Loop(x, 2)
  840.     {
  841.         format(string, sizeof(string), "vPosX_%d", x), RaceVehCoords[x][0] = dini_Float(rFile, string);
  842.         format(string, sizeof(string), "vPosY_%d", x), RaceVehCoords[x][1] = dini_Float(rFile, string);
  843.         format(string, sizeof(string), "vPosZ_%d", x), RaceVehCoords[x][2] = dini_Float(rFile, string);
  844.         format(string, sizeof(string), "vAngle_%d", x), RaceVehCoords[x][3] = dini_Float(rFile, string);
  845.         #if DEBUG_RACE == 1
  846.         printf("VehiclePos %d: %f, %f, %f, %f", x, RaceVehCoords[x][0], RaceVehCoords[x][1], RaceVehCoords[x][2], RaceVehCoords[x][3]);
  847.         #endif
  848.     }
  849.     Loop(x, TotalCP)
  850.     {
  851.         format(string, sizeof(string), "CP_%d_PosX", x), CPCoords[x][0] = dini_Float(rFile, string);
  852.         format(string, sizeof(string), "CP_%d_PosY", x), CPCoords[x][1] = dini_Float(rFile, string);
  853.         format(string, sizeof(string), "CP_%d_PosZ", x), CPCoords[x][2] = dini_Float(rFile, string);
  854.         #if DEBUG_RACE == 1
  855.         printf("RaceCheckPoint %d: %f, %f, %f", x, CPCoords[x][0], CPCoords[x][1], CPCoords[x][2]);
  856.         #endif
  857.     }
  858.     Position = 0;
  859.     FinishCount = 0;
  860.     JoinCount = 0;
  861.     Loop(x, 2) PlayersCount[x] = 0;
  862.     Joined[playerid] = true;
  863.     CountAmount = COUNT_DOWN_TILL_RACE_START;
  864.     RaceTime = MAX_RACE_TIME;
  865.     RaceBusy = 0x01;
  866.     TimeProgress = 0;
  867.     SetupRaceForPlayer(playerid);
  868.     CountTimer = SetTimer("CountTillRace", 999, 1);
  869.     return 1;
  870. }
  871.  
  872. function SetCP(playerid, PrevCP, NextCP, MaxCP, Type)
  873. {
  874.     if(Type == 0)
  875.     {
  876.         if(NextCP == MaxCP) SetPlayerRaceCheckpoint(playerid, 1, CPCoords[PrevCP][0], CPCoords[PrevCP][1], CPCoords[PrevCP][2], CPCoords[NextCP][0], CPCoords[NextCP][1], CPCoords[NextCP][2], RACE_CHECKPOINT_SIZE);
  877.             else SetPlayerRaceCheckpoint(playerid, 0, CPCoords[PrevCP][0], CPCoords[PrevCP][1], CPCoords[PrevCP][2], CPCoords[NextCP][0], CPCoords[NextCP][1], CPCoords[NextCP][2], RACE_CHECKPOINT_SIZE);
  878.     }
  879.     else if(Type == 3)
  880.     {
  881.         if(NextCP == MaxCP) SetPlayerRaceCheckpoint(playerid, 4, CPCoords[PrevCP][0], CPCoords[PrevCP][1], CPCoords[PrevCP][2], CPCoords[NextCP][0], CPCoords[NextCP][1], CPCoords[NextCP][2], RACE_CHECKPOINT_SIZE);
  882.             else SetPlayerRaceCheckpoint(playerid, 3, CPCoords[PrevCP][0], CPCoords[PrevCP][1], CPCoords[PrevCP][2], CPCoords[NextCP][0], CPCoords[NextCP][1], CPCoords[NextCP][2], RACE_CHECKPOINT_SIZE);
  883.     }
  884.     return 1;
  885. }
  886.  
  887. function SetupRaceForPlayer(playerid)
  888. {
  889.     CPProgess[playerid] = 0;
  890.     TogglePlayerControllable(playerid, false);
  891.     CPCoords[playerid][3] = 0;
  892.     SetCP(playerid, CPProgess[playerid], CPProgess[playerid]+1, TotalCP, RaceType);
  893.     if(IsOdd(playerid)) Index = 1;
  894.         else Index = 0;
  895.  
  896.     switch(Index)
  897.     {
  898.         case 0:
  899.         {
  900.             if(PlayersCount[0] == 1)
  901.             {
  902.  
  903.                 RaceVehCoords[0][0] -= (6 * floatsin(-RaceVehCoords[0][3], degrees));
  904.                 RaceVehCoords[0][1] -= (6 * floatcos(-RaceVehCoords[0][3], degrees));
  905.                 if(IsPlayerInAnyVehicle(playerid) == 1)
  906.                 RepairVehicle(playerid);
  907.                 CreatedRaceVeh[playerid] = CreateVehicle(RaceVehicle, RaceVehCoords[0][0], RaceVehCoords[0][1], RaceVehCoords[0][2]+2, RaceVehCoords[0][3], random(126), random(126), (60 * 60));
  908.                 SetPlayerPos(playerid, RaceVehCoords[0][0], RaceVehCoords[0][1], RaceVehCoords[0][2]+2);
  909.                 SetPlayerFacingAngle(playerid, RaceVehCoords[0][3]);
  910.                 PutPlayerInVehicle(playerid, CreatedRaceVeh[playerid], RepairVehicle(playerid));
  911.                 SetVehicleHealth(GetPlayerVehicleID(playerid),99999);
  912.                 Camera(playerid, RaceVehCoords[0][0], RaceVehCoords[0][1], RaceVehCoords[0][2], RaceVehCoords[0][3], 20);
  913.             }
  914.         }
  915.         case 1:
  916.         {
  917.             if(PlayersCount[1] == 1)
  918.             {
  919.  
  920.                 RaceVehCoords[1][0] -= (6 * floatsin(-RaceVehCoords[1][3], degrees));
  921.                 RaceVehCoords[1][1] -= (6 * floatcos(-RaceVehCoords[1][3], degrees));
  922.                 CreatedRaceVeh[playerid] = CreateVehicle(RaceVehicle, RaceVehCoords[1][0], RaceVehCoords[1][1], RaceVehCoords[1][2]+2, RaceVehCoords[1][3], random(126), random(126), (60 * 60));
  923.                 SetPlayerPos(playerid, RaceVehCoords[1][0], RaceVehCoords[1][1], RaceVehCoords[1][2]+2);
  924.                 SetPlayerFacingAngle(playerid, RaceVehCoords[1][3]);
  925.                 PutPlayerInVehicle(playerid, CreatedRaceVeh[playerid], 0);
  926.                 SetVehicleHealth(GetPlayerVehicleID(playerid),99999);
  927.                 RepairVehicle(GetPlayerVehicleID(playerid));
  928.                 Camera(playerid, RaceVehCoords[1][0], RaceVehCoords[1][1], RaceVehCoords[1][2], RaceVehCoords[1][3], 20);
  929.             }
  930.         }
  931.     }
  932.     switch(Index)
  933.     {
  934.         case 0:
  935.         {
  936.             if(PlayersCount[0] != 1)
  937.             {
  938.  
  939.                 CreatedRaceVeh[playerid] = CreateVehicle(RaceVehicle, RaceVehCoords[0][0], RaceVehCoords[0][1], RaceVehCoords[0][2]+2, RaceVehCoords[0][3], random(126), random(126), (60 * 60));
  940.                 SetPlayerPos(playerid, RaceVehCoords[0][0], RaceVehCoords[0][1], RaceVehCoords[0][2]+2);
  941.                 SetPlayerFacingAngle(playerid, RaceVehCoords[0][3]);
  942.                 PutPlayerInVehicle(playerid, CreatedRaceVeh[playerid], 0);
  943.                 SetVehicleHealth(GetPlayerVehicleID(playerid),99999);
  944.                 RepairVehicle(GetPlayerVehicleID(playerid));
  945.                 Camera(playerid, RaceVehCoords[0][0], RaceVehCoords[0][1], RaceVehCoords[0][2], RaceVehCoords[0][3], 20);
  946.                 PlayersCount[0] = 1;
  947.             }
  948.         }
  949.         case 1:
  950.         {
  951.             if(PlayersCount[1] != 1)
  952.             {
  953.  
  954.                 CreatedRaceVeh[playerid] = CreateVehicle(RaceVehicle, RaceVehCoords[1][0], RaceVehCoords[1][1], RaceVehCoords[1][2]+2, RaceVehCoords[1][3], random(126), random(126), (60 * 60));
  955.                 SetPlayerPos(playerid, RaceVehCoords[1][0], RaceVehCoords[1][1], RaceVehCoords[1][2]+2);
  956.                 SetVehicleHealth(GetPlayerVehicleID(playerid),99999);
  957.                 SetPlayerFacingAngle(playerid, RaceVehCoords[1][3]);
  958.                 PutPlayerInVehicle(playerid, CreatedRaceVeh[playerid], 0);
  959.                 Camera(playerid, RaceVehCoords[1][0], RaceVehCoords[1][1], RaceVehCoords[1][2], RaceVehCoords[1][3], 20);
  960.                 PlayersCount[1] = 1;
  961.             }
  962.         }
  963.     }
  964.     new
  965.         string[128]
  966.     ;
  967.     #if defined RACE_IN_OTHER_WORLD
  968.     SetPlayerVirtualWorld(playerid, 10);
  969.     #endif
  970.     InfoTimer[playerid] = SetTimerEx("TextInfo", 500, 1, "e", playerid);
  971.     if(JoinCount == 1) format(string, sizeof(string), "Corrida: ~w~%s~n~~p~~h~Checkpoint: ~w~%d/%d~n~~b~~h~RaceTime: ~w~%s~n~~y~Posição: ~w~1/1~n~ ", RaceName, CPProgess[playerid], TotalCP, TimeConvert(RaceTime));
  972.         else format(string, sizeof(string), "Corrida: ~w~%s~n~~p~~h~Checkpoint: ~w~%d/%d~n~~b~~h~RaceTime: ~w~%s~n~~y~Posição: ~w~%d/%d~n~ ", RaceName, CPProgess[playerid], TotalCP, TimeConvert(RaceTime), RacePosition[playerid], JoinCount);
  973.     TextDrawSetString(RaceInfo[playerid], string);
  974.     TextDrawShowForPlayer(playerid, RaceInfo[playerid]);
  975.     JoinCount++;
  976.     return 1;
  977. }
  978.  
  979. function CountTillRace()
  980. {
  981.     switch(CountAmount)
  982.     {
  983.         case 0:
  984.         {
  985.             ForEach(i, MAX_PLAYERS)
  986.             {
  987.                 if(Joined[i] == false)
  988.                 {
  989.                     new
  990.                         string[128]
  991.                     ;
  992.                     format(string, sizeof(string), ">> Você não pode participar de corrida chamado %s mais. Junte-se tempo está acabado!", RaceName);
  993.                     SendClientMessage(i, RED, string);
  994.                 }
  995.             }
  996.             StartRace();
  997.         }
  998.         case 1..5:
  999.         {
  1000.             new
  1001.                 string[10]
  1002.             ;
  1003.             format(string, sizeof(string), "~b~%d", CountAmount);
  1004.             ForEach(i, MAX_PLAYERS)
  1005.             {
  1006.                 if(Joined[i] == true)
  1007.                 {
  1008.                     GameTextForPlayer(i, string, 999, 5);
  1009.                     PlayerPlaySound(i, 1056, 0.0, 0.0, 0.0);
  1010.                 }
  1011.             }
  1012.         }
  1013.         case 60, 50, 40, 30, 20, 10:
  1014.         {
  1015.             new
  1016.                 string[128]
  1017.             ;
  1018.             format(string, sizeof(string), ">> Uma Corrida Foi Iniciada ! Digite /EntrarRace para Participar da Corrida");
  1019.             SendClientMessageToAll(RED, string);
  1020.         }
  1021.     }
  1022.     return CountAmount--;
  1023. }
  1024.  
  1025. function StartRace()
  1026. {
  1027.     ForEach(i, MAX_PLAYERS)
  1028.     {
  1029.         if(Joined[i] == true)
  1030.         {
  1031.             TogglePlayerControllable(i, true);
  1032.             PlayerPlaySound(i, 1057, 0.0, 0.0, 0.0);
  1033.             GameTextForPlayer(i, "~g~GO GO GO", 2000, 5);
  1034.             SetCameraBehindPlayer(i);
  1035.             SetVehicleHealth(GetPlayerVehicleID(i),99999);
  1036.             RepairVehicle(GetPlayerVehicleID(i));
  1037.         }
  1038.     }
  1039.     rCounter = SetTimer("RaceCounter", 900, 1);
  1040.     RaceTick = GetTickCount();
  1041.     RaceStarted = 1;
  1042.     KillTimer(CountTimer);
  1043.     return 1;
  1044. }
  1045.  
  1046. function StopRace()
  1047. {
  1048.     KillTimer(rCounter);
  1049.     RaceStarted = 0;
  1050.     RaceTick = 0;
  1051.     RaceBusy = 0x00;
  1052.     JoinCount = 0;
  1053.     FinishCount = 0;
  1054.     TimeProgress = 0;
  1055.  
  1056.     ForEach(i, MAX_PLAYERS)
  1057.     {
  1058.         if(Joined[i] == true)
  1059.         {
  1060.             DisablePlayerRaceCheckpoint(i);
  1061.             DestroyVehicle(CreatedRaceVeh[i]);
  1062.             Joined[i] = false;
  1063.             TextDrawHideForPlayer(i, RaceInfo[i]);
  1064.             CPProgess[i] = 0;
  1065.             KillTimer(InfoTimer[i]);
  1066.         }
  1067.     }
  1068.     SendClientMessageToAll(RED, "");
  1069.     if(AutomaticRace == true) LoadRaceNames(), LoadAutoRace(RaceNames[random(TotalRaces)]);
  1070.     return 1;
  1071. }
  1072.  
  1073. function RaceCounter()
  1074. {
  1075.     if(RaceStarted == 1)
  1076.     {
  1077.         RaceTime--;
  1078.         if(JoinCount <= 0)
  1079.         {
  1080.             StopRace();
  1081.             SendClientMessageToAll(RED, "---------------------------------------------------------------------------------------");
  1082.             SendClientMessageToAll(RED, "");
  1083.             SendClientMessageToAll(RED, ">> Corrida Encerrada Por Nao Haver Competidores ...");
  1084.             SendClientMessageToAll(RED, "");
  1085.             SendClientMessageToAll(RED, "---------------------------------------------------------------------------------------");
  1086.         }
  1087.     }
  1088.     if(RaceTime <= 0)
  1089.     {
  1090.         StopRace();
  1091.     }
  1092.     return 1;
  1093. }
  1094.  
  1095. function TextInfo(playerid)
  1096. {
  1097.     new
  1098.         string[128]
  1099.     ;
  1100.     if(JoinCount == 1) format(string, sizeof(string), "RaceName: ~w~%s~n~~p~~h~Checkpoint: ~w~%d/%d~n~~b~~h~RaceTime: ~w~%s~n~~y~RacePosition: ~w~1/1~n~", RaceName, CPProgess[playerid], TotalCP, TimeConvert(RaceTime));
  1101.         else format(string, sizeof(string), "RaceName: ~w~%s~n~~p~~h~Checkpoint: ~w~%d/%d~n~~b~~h~RaceTime: ~w~%s~n~~y~RacePosition: ~w~%d/%d~n~", RaceName, CPProgess[playerid], TotalCP, TimeConvert(RaceTime), RacePosition[playerid], JoinCount);
  1102.     TextDrawSetString(RaceInfo[playerid], string);
  1103.     TextDrawShowForPlayer(playerid, RaceInfo[playerid]);
  1104. }
  1105.  
  1106. function Camera(playerid, Float:X, Float:Y, Float:Z, Float:A, Mul)
  1107. {
  1108.     SetPlayerCameraLookAt(playerid, X, Y, Z);
  1109.     SetPlayerCameraPos(playerid, X + (Mul * floatsin(-A, degrees)), Y + (Mul * floatcos(-A, degrees)), Z+6);
  1110. }
  1111.  
  1112. function IsPlayerInRace(playerid)
  1113. {
  1114.     if(Joined[playerid] == true) return true;
  1115.         else return false;
  1116. }
  1117.  
  1118. function ShowDialog(playerid, dialogid)
  1119. {
  1120.     switch(dialogid)
  1121.     {
  1122.         case 599: ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_LIST, CreateCaption("Construir Nova Corrida"), "\
  1123.         Corrida Terrestre / Nautica\n\
  1124.         Corrida Aerea", "Next", "Exit");
  1125.  
  1126.         case 600: ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_INPUT, CreateCaption("Construir Nova Corrida (Etapa 1/4)"), "\
  1127.         {F50000}Etapa 1:\n\
  1128.         \n\
  1129.         {A1A1A3}Bem Vindo a Modo 'Construção de Corrida'.\n\
  1130.         Aqui Voce Iniciar a Construir uma Nova Corrida, Insira um NOME para Sua Corrida, EX: RACE-1\n\n\
  1131.         >> Insira Um NOME para Sua Corrida e Pressione 'Next' Para Continuar.", "Next", "Back");
  1132.  
  1133.         case 601: ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_INPUT, CreateCaption("Construir Nova Corrida (Etapa 1/4)"), "\
  1134.         {F50000}ERRO: Nome Da Corrida Muito Grande/Pequeno (Min. 1 - Max. 20)\n\n\
  1135.         {F50000}Etapa 1:\n\
  1136.         ********\n\
  1137.         {A1A1A3}Bem Vindo ao Modo 'Construção de Corrida'.\n\
  1138.         Aqui Voce Iniciar a Construir uma Nova Corrida, Insira um NOME para Sua Corrida, EX: RACE-1\n\n\
  1139.         >> Insira o Nome da Corrida e Pressione 'Next' Para Continuar", "Next", "Back");
  1140.  
  1141.         case 602: ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_INPUT, CreateCaption("Construir Nova Corrida (Etapa 2/4)"), "\
  1142.         {F50000}Etapa 2:\n\
  1143.         \n\
  1144.         {A1A1A3}Insira o ID do Veiculo a Ser usado Na Corrida Ou o NOME Para Continuar Sua Construção.\n\n\
  1145.         >> Insira o ID ou o NOME Do Veiculo e Pressione 'Next' Para Continuar. 'Back' Para Voltar.", "Next", "Back");
  1146.  
  1147.         case 603: ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_INPUT, CreateCaption("Construir Nova Corrida (Etapa 2/4)"), "\
  1148.         {F50000}ERRO: ID Invalido/Nome\n\n\
  1149.         {F50000}Etapa 2:\n\
  1150.         \n\
  1151.         {A1A1A3}ID Invalido!  Insira o ID do Veiculo a Ser usado Na Corrida Ou o NOME Para Continuar Sua Construção.\n\n\
  1152.         >> Insira o ID ou o NOME Do Veiculo e Pressione 'Next' Para Continuar. 'Back' Para Voltar. ", "Next", "Back");
  1153.  
  1154.         case 604: ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_MSGBOX, CreateCaption("Construir Nova Corrida (Etapa 3/4)"),
  1155.         "\
  1156.         {F50000}Etapa3:\n\
  1157.         \n\
  1158.         {A1A1A3}Agora Voce Tera que Setar as Posições do Primeiro e Segundo Lugar da Largada.\n\
  1159.         Nota: Clicando Em 'OK' Retorna em Modo Free. Aperte 'KEY_FIRE' Para Setar as Posições do Primeiro e Segundo Lugar.  \n\
  1160.         Nota: Apos Setar as Posições, Voce ira para a Ultima Etapa da Construção\n\n\
  1161.         >> Pressione 'OK' Para Continuar. 'Back' Para Voltar.", "OK", "Back");
  1162.  
  1163.         case 605: ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_MSGBOX, CreateCaption("Construir Nova Corrida (Etapa 4/4)"),
  1164.         "\
  1165.         {F50000}Etapa 4:\n\
  1166.         \n\
  1167.         {A1A1A3}Aqui Voce Setara os Check-Points Para Sua Corrida.\n\
  1168.         Para Setar os Check-Poits Pressione 'KEY_FIRE' No Lugar Desejado, o Check-Point Ira Salvar Automaticamente. \n\
  1169.         Ao Terminar Pressione 'ENTER' Para Finalizar Sua Corrida \n\n\
  1170.         >> Pressione 'OK' Para Continuar. 'Back' Para Voltar.", "OK", "Back");
  1171.  
  1172.         case 606: ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_MSGBOX, CreateCaption("Construir Nova Corrida (Done)"),
  1173.         "\
  1174.         Você Criou uma nova Corrida. \n\n\
  1175.         >> Pressione 'Final' Para Terminar ou 'Exit' Para Sair Sem Salvar a Corrida ", "Final", "Exit");
  1176.     }
  1177.     return 1;
  1178. }
  1179.  
  1180. CreateCaption(arguments[])
  1181. {
  1182.  
  1183.     new
  1184.         string[128 char]
  1185.     ;
  1186.     format(string, sizeof(string), "{03FF5F}» {F50000}Corrida", arguments);
  1187.     return string;
  1188. }
  1189.  
  1190. stock IsValidVehicle(vehicleid)
  1191. {
  1192.     if(vehicleid < 400 || vehicleid > 611) return false;
  1193.         else return true;
  1194. }
  1195.  
  1196. ReturnVehicleID(vName[])
  1197. {
  1198.     Loop(x, 211)
  1199.     {
  1200.         if(strfind(vNames[x], vName, true) != -1)
  1201.         return x + 400;
  1202.     }
  1203.     return -1;
  1204. }
  1205.  
  1206. TimeConvert(seconds)
  1207. {
  1208.     new tmp[16];
  1209.     new minutes = floatround(seconds/60);
  1210.     seconds -= minutes*60;
  1211.     format(tmp, sizeof(tmp), "%d:%02d", minutes, seconds);
  1212.     return tmp;
  1213. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement