Gracias :'D
Casi No Lo Soluciono, GRACIAS !! PostData: Esperando Fs :3 ![]() |
#include <a_samp> #include <dini> #include <zcmd> #pragma unused \ ret_memcpy #define ForEach(%0,%1) \ for(new %0 = 0; %0 != %1; %0++) if(IsPlayerConnected(%0) && !IsPlayerNPC(%0)) #define Loop(%0,%1) \ for(new %0 = 0; %0 != %1; %0++) #define IsOdd(%1) \ ((%1) & 1) #define ConvertTime(%0,%1,%2,%3,%4) \ new \ Float: %0 = floatdiv(%1, 60000) \ ;\ %2 = floatround(%0, floatround_tozero); \ %3 = floatround(floatmul(%0 - %2, 60), floatround_tozero); \ %4 = floatround(floatmul(floatmul(%0 - %2, 60) - %3, 1000), floatround_tozero) #define function%0(%1) \ forward%0(%1); public%0(%1) #define MAX_RACE_CHECKPOINTS_EACH_RACE \ 200 #define COUNT_DOWN_TILL_RACE_START \ 30 #define MAX_RACE_TIME \ 300 #define RACE_CHECKPOINT_SIZE \ 12.0 #define DEBUG_RACE \ 1 #define GREY \ 0xAFAFAFAA #define GREEN \ 0x33AA33AA #define RED \ 0xE60000FF #define YELLOW \ 0xFFFF00AA #define WHITE \ 0xFFFFFFAA //*============================================================================= new vNames[212][] = { {"Landstalker"}, {"Bravura"}, {"Buffalo"}, {"Linerunner"}, {"Perrenial"}, {"Sentinel"}, {"Dumper"}, {"Firetruck"}, {"Trashmaster"}, {"Stretch"}, {"Manana"}, {"Infernus"}, {"Voodoo"}, {"Pony"}, {"Mule"}, {"Cheetah"}, {"Ambulance"}, {"Leviathan"}, {"Moonbeam"}, {"Esperanto"}, {"Taxi"}, {"Washington"}, {"Bobcat"}, {"Mr Whoopee"}, {"BF Injection"}, {"Hunter"}, {"Premier"}, {"Enforcer"}, {"Securicar"}, {"Banshee"}, {"Predator"}, {"Bus"}, {"Rhino"}, {"Barracks"}, {"Hotknife"}, {"Trailer 1"}, {"Previon"}, {"Coach"}, {"Cabbie"}, {"Stallion"}, {"Rumpo"}, {"RC Bandit"}, {"Romero"}, {"Packer"}, {"Monster"}, {"Admiral"}, {"Squalo"}, {"Seasparrow"}, {"Pizzaboy"}, {"Tram"}, {"Trailer 2"}, {"Turismo"}, {"Speeder"}, {"Reefer"}, {"Tropic"}, {"Flatbed"}, {"Yankee"}, {"Caddy"}, {"Solair"}, {"Berkley's RC Van"}, {"Skimmer"}, {"PCJ-600"}, {"Faggio"}, {"Freeway"}, {"RC Baron"}, {"RC Raider"}, {"Glendale"}, {"Oceanic"}, {"Sanchez"}, {"Sparrow"}, {"Patriot"}, {"Quad"}, {"Coastguard"}, {"Dinghy"}, {"Hermes"}, {"Sabre"}, {"Rustler"}, {"ZR-350"}, {"Walton"}, {"Regina"}, {"Comet"}, {"BMX"}, {"Burrito"}, {"Camper"}, {"Marquis"}, {"Baggage"}, {"Dozer"}, {"Maverick"}, {"News Chopper"}, {"Rancher"}, {"FBI Rancher"}, {"Virgo"}, {"Greenwood"}, {"Jetmax"}, {"Hotring"}, {"Sandking"}, {"Blista Compact"}, {"Police Maverick"}, {"Boxville"}, {"Benson"}, {"Mesa"}, {"RC Goblin"}, {"Hotring Racer A"}, {"Hotring Racer B"}, {"Bloodring Banger"}, {"Rancher"}, {"Super GT"}, {"Elegant"}, {"Journey"}, {"Bike"}, {"Mountain Bike"}, {"Beagle"}, {"Cropdust"}, {"Stunt"}, {"Tanker"}, {"Roadtrain"}, {"Nebula"}, {"Majestic"}, {"Buccaneer"}, {"Shamal"}, {"Hydra"}, {"FCR-900"}, {"NRG-500"}, {"HPV1000"}, {"Cement Truck"}, {"Tow Truck"}, {"Fortune"}, {"Cadrona"}, {"FBI Truck"}, {"Willard"}, {"Forklift"}, {"Tractor"}, {"Combine"}, {"Feltzer"}, {"Remington"}, {"Slamvan"}, {"Blade"}, {"Freight"}, {"Streak"}, {"Vortex"}, {"Vincent"}, {"Bullet"}, {"Clover"}, {"Sadler"}, {"Firetruck LA"}, {"Hustler"}, {"Intruder"}, {"Primo"}, {"Cargobob"}, {"Tampa"}, {"Sunrise"}, {"Merit"}, {"Utility"}, {"Nevada"}, {"Yosemite"}, {"Windsor"}, {"Monster A"}, {"Monster B"}, {"Uranus"}, {"Jester"}, {"Sultan"}, {"Stratum"}, {"Elegy"}, {"Raindance"}, {"RC Tiger"}, {"Flash"}, {"Tahoma"}, {"Savanna"}, {"Bandito"}, {"Freight Flat"}, {"Streak Carriage"}, {"Kart"}, {"Mower"}, {"Duneride"}, {"Sweeper"}, {"Broadway"}, {"Tornado"}, {"AT-400"}, {"DFT-30"}, {"Huntley"}, {"Stafford"}, {"BF-400"}, {"Newsvan"}, {"Tug"}, {"Trailer 3"}, {"Emperor"}, {"Wayfarer"}, {"Euros"}, {"Hotdog"}, {"Club"}, {"Freight Carriage"}, {"Trailer 3"}, {"Andromada"}, {"Dodo"}, {"RC Cam"}, {"Launch"}, {"Police Car (LSPD)"}, {"Police Car (SFPD)"}, {"Police Car (LVPD)"}, {"Police Ranger"}, {"Picador"}, {"S.W.A.T. Van"}, {"Alpha"}, {"Phoenix"}, {"Glendale"}, {"Sadler"}, {"Luggage Trailer A"}, {"Luggage Trailer B"}, {"Stair Trailer"}, {"Boxville"}, {"Farm Plow"}, {"Utility Trailer"} }, BuildRace, BuildRaceType, BuildVehicle, BuildCreatedVehicle, BuildModeVID, BuildName[30], bool: BuildTakeVehPos, BuildVehPosCount, bool: BuildTakeCheckpoints, BuildCheckPointCount, RaceBusy = 0x00, RaceName[30], RaceVehicle, RaceType, TotalCP, Float: RaceVehCoords[4][2], Float: CPCoords[4][MAX_RACE_CHECKPOINTS_EACH_RACE], CreatedRaceVeh[MAX_PLAYERS], Index, PlayersCount[2], CountTimer, CountAmount, bool: Joined[MAX_PLAYERS], RaceTick, RaceStarted, CPProgess[MAX_PLAYERS], Position, FinishCount, JoinCount, rCounter, RaceTime, Text: RaceInfo[MAX_PLAYERS], InfoTimer[MAX_PLAYERS], RacePosition[MAX_PLAYERS] ; //*============================================================================= public OnFilterScriptExit() { BuildCreatedVehicle = (BuildCreatedVehicle == 0x01) ? (DestroyVehicle(BuildVehicle), BuildCreatedVehicle = 0x00) : (DestroyVehicle(BuildVehicle), BuildCreatedVehicle = 0x00); KillTimer(rCounter); KillTimer(CountTimer); Loop(i, MAX_PLAYERS) { DisablePlayerRaceCheckpoint(i); TextDrawDestroy(RaceInfo[i]); DestroyVehicle(CreatedRaceVeh[i]); Joined[i] = false; KillTimer(InfoTimer[i]); } JoinCount = 0; FinishCount = 0; return 1; } //*============================================================================= CMD:buildrace(playerid, params[]) { if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, RED, "<!> Usted no es un administrador!"); if(BuildRace != 0) return SendClientMessage(playerid, RED, "<!> Ya hay alguien que construye una carrera!"); if(RaceBusy == 0x01) return SendClientMessage(playerid, RED, "<!> Espere hasta que termine la primera carrera!"); if(IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, RED, "<!> Por favor, deje su vehнculo primero!"); BuildRace = playerid+1; ShowDialog(playerid, 599); return 1; } //*============================================================================= CMD:startrace(playerid, params[]) { if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, RED, "<!> Usted no es un administrador!"); if(BuildRace != 0) return SendClientMessage(playerid, RED, "<!> Hay una carrera iniciada, espere que termine!"); if(RaceBusy == 0x01 || RaceStarted == 1) return SendClientMessage(playerid, RED, "<!> Hay una Carrera en la actualidad, espere a que finalize!"); if(isnull(params)) return SendClientMessage(playerid, RED, "<!> /startrace [racename]"); LoadRace(playerid, params); return 1; } //*============================================================================= CMD:stoprace(playerid, params[]) { if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, RED, "<!> Usted no es un administrador!"); if(RaceBusy == 0x00 || RaceStarted == 0) return SendClientMessage(playerid, RED, "<!> No hay carrera para detener!"); SendClientMessageToAll(RED, ">>Un administrador detuvo la carrera actual!"); return StopRace(); } //*============================================================================= CMD:join(playerid, params[]) { if(RaceStarted == 1) return SendClientMessage(playerid, RED, "<!> La carrera ya ha comenzado! Espere hasta que termine!"); if(RaceBusy == 0x00) return SendClientMessage(playerid, RED, "<!> No hay carrera para unirse"); if(Joined[playerid] == true) return SendClientMessage(playerid, RED, "<!> Ya se uniу a una carrera!"); if(IsPlayerInAnyVehicle(playerid)) return SetTimerEx("SetupRaceForPlayer", 2500, 0, "e", playerid), RemovePlayerFromVehicle(playerid), Joined[playerid] = true; SetupRaceForPlayer(playerid); Joined[playerid] = true; return 1; } //*============================================================================= public OnPlayerEnterRaceCheckpoint(playerid) { if(CPProgess[playerid] == TotalCP -1) { new TimeStamp, TotalRaceTime, string[128], pName[MAX_PLAYER_NAME], rTime[3], Prize[2] ; Position++; FinishCount++; GetPlayerName(playerid, pName, sizeof(pName)); TimeStamp = GetTickCount(); TotalRaceTime = TimeStamp - RaceTick; ConvertTime(var, TotalRaceTime, rTime[0], rTime[1], rTime[2]); switch(Position) { case 1: Prize[0] = (random(random(5000)) + 10000), Prize[1] = 10; case 2: Prize[0] = (random(random(4500)) + 9000), Prize[1] = 9; case 3: Prize[0] = (random(random(4000)) + 8000), Prize[1] = 8; case 4: Prize[0] = (random(random(3500)) + 7000), Prize[1] = 7; case 5: Prize[0] = (random(random(3000)) + 6000), Prize[1] = 6; case 6: Prize[0] = (random(random(2500)) + 5000), Prize[1] = 5; case 7: Prize[0] = (random(random(2000)) + 4000), Prize[1] = 4; case 8: Prize[0] = (random(random(1500)) + 3000), Prize[1] = 3; case 9: Prize[0] = (random(random(1000)) + 2000), Prize[1] = 2; default: Prize[0] = random(random(1000)), Prize[1] = 1; } format(string, sizeof(string), ">> \"%s\" ha terminado la carrera en la posiciуn \"%d\".", pName, Position); SendClientMessageToAll(WHITE, string); format(string, sizeof(string), " - Time: \"%d:%d.%d\".", rTime[0], rTime[1], rTime[2]); SendClientMessageToAll(WHITE, string); format(string, sizeof(string), " - Premio: \"$%d \".", Prize[0], Prize[1]); SendClientMessageToAll(WHITE, string); GivePlayerMoney(playerid, Prize[0]); SetPlayerScore(playerid, GetPlayerScore(playerid) + Prize[1]); DisablePlayerRaceCheckpoint(playerid); CPProgess[playerid]++; if(FinishCount >= JoinCount) return StopRace(); } else { CPProgess[playerid]++; CPCoords[3][CPProgess[playerid]]++; RacePosition[playerid] = floatround(CPCoords[3][CPProgess[playerid]], floatround_floor); SetCP(playerid, CPProgess[playerid], CPProgess[playerid]+1, TotalCP, RaceType); PlayerPlaySound(playerid, 1137, 0.0, 0.0, 0.0); } return 1; } //*============================================================================= public OnPlayerDisconnect(playerid) { DestroyVehicle(CreatedRaceVeh[playerid]); DisablePlayerRaceCheckpoint(playerid); if(Joined[playerid] == true) { JoinCount--; Joined[playerid] = false; } TextDrawHideForPlayer(playerid, RaceInfo[playerid]); TextDrawDestroy(RaceInfo[playerid]); CPProgess[playerid] = 0; KillTimer(InfoTimer[playerid]); if(BuildRace == playerid+1) BuildRace = 0; return 1; } //*============================================================================= public OnPlayerConnect(playerid) { RaceInfo[playerid] = TextDrawCreate(633.000000, 348.000000, " "); TextDrawAlignment(RaceInfo[playerid], 3); TextDrawBackgroundColor(RaceInfo[playerid], 255); TextDrawFont(RaceInfo[playerid], 1); TextDrawLetterSize(RaceInfo[playerid], 0.240000, 1.100000); TextDrawColor(RaceInfo[playerid], -687931137); TextDrawSetOutline(RaceInfo[playerid], 0); TextDrawSetProportional(RaceInfo[playerid], 1); TextDrawSetShadow(RaceInfo[playerid], 1); return 1; } //*============================================================================= public OnPlayerDeath(playerid) { DestroyVehicle(CreatedRaceVeh[playerid]); DisablePlayerRaceCheckpoint(playerid); if(Joined[playerid] == true) { JoinCount--; Joined[playerid] = false; } TextDrawHideForPlayer(playerid, RaceInfo[playerid]); CPProgess[playerid] = 0; KillTimer(InfoTimer[playerid]); if(BuildRace == playerid+1) BuildRace = 0; return 1; } //*============================================================================= public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) { switch(dialogid) { case 599: { if(!response) return BuildRace = 0; switch(listitem) { case 0: BuildRaceType = 0; case 1: BuildRaceType = 3; } ShowDialog(playerid, 600); } case 600..601: { //*============================================================================= if(!response) return ShowDialog(playerid, 599); if(!strlen(inputtext)) return ShowDialog(playerid, 601); if(strlen(inputtext) < 1 || strlen(inputtext) > 20) return ShowDialog(playerid, 601); strmid(BuildName, inputtext, 0, strlen(inputtext), sizeof(BuildName)); ShowDialog(playerid, 602); } case 602..603: { if(!response) return ShowDialog(playerid, 600); if(!strlen(inputtext)) return ShowDialog(playerid, 603); if(isNumeric(inputtext)) { if(!IsValidVehicle(strval(inputtext))) return ShowDialog(playerid, 603); new Float: pPos[4] ; GetPlayerPos(playerid, pPos[0], pPos[1], pPos[2]); GetPlayerFacingAngle(playerid, pPos[3]); BuildModeVID = strval(inputtext); BuildCreatedVehicle = (BuildCreatedVehicle == 0x01) ? (DestroyVehicle(BuildVehicle), BuildCreatedVehicle = 0x00) : (DestroyVehicle(BuildVehicle), BuildCreatedVehicle = 0x00); BuildVehicle = CreateVehicle(strval(inputtext), pPos[0], pPos[1], pPos[2], pPos[3], random(126), random(126), (60 * 60)); PutPlayerInVehicle(playerid, BuildVehicle, 0); BuildCreatedVehicle = 0x01; ShowDialog(playerid, 604); } else { //*============================================================================= if(!IsValidVehicle(ReturnVehicleID(inputtext))) return ShowDialog(playerid, 603); new Float: pPos[4] ; GetPlayerPos(playerid, pPos[0], pPos[1], pPos[2]); GetPlayerFacingAngle(playerid, pPos[3]); BuildModeVID = ReturnVehicleID(inputtext); BuildCreatedVehicle = (BuildCreatedVehicle == 0x01) ? (DestroyVehicle(BuildVehicle), BuildCreatedVehicle = 0x00) : (DestroyVehicle(BuildVehicle), BuildCreatedVehicle = 0x00); BuildVehicle = CreateVehicle(ReturnVehicleID(inputtext), pPos[0], pPos[1], pPos[2], pPos[3], random(126), random(126), (60 * 60)); PutPlayerInVehicle(playerid, BuildVehicle, 0); BuildCreatedVehicle = 0x01; ShowDialog(playerid, 604); } } case 604: { //*============================================================================= if(!response) return ShowDialog(playerid, 602); SendClientMessage(playerid, GREEN, ">> Ir a la lнnea de salida de la carrera, posisionate donde saldran los 2 primeros autos de la fila y presiona 'Control."); SendClientMessage(playerid, GREEN, " - Cuando haga esto, verб un cuadro de diбlogo para continuar."); BuildVehPosCount = 0; BuildTakeVehPos = true; } case 605: { //*============================================================================= if(!response) return ShowDialog(playerid, 604); SendClientMessage(playerid, GREEN, ">> Comience a tomar puestos de control ahora haciendo clic 'Control'."); SendClientMessage(playerid, GREEN, " - Presione 'ENTER' cuando haya terminado con los puntos de control!"); BuildCheckPointCount = 0; BuildTakeCheckpoints = true; } case 606: { //*============================================================================= if(!response) return ShowDialog(playerid, 606); BuildRace = 0; BuildCheckPointCount = 0; BuildVehPosCount = 0; BuildTakeCheckpoints = false; BuildTakeVehPos = false; BuildCreatedVehicle = (BuildCreatedVehicle == 0x01) ? (DestroyVehicle(BuildVehicle), BuildCreatedVehicle = 0x00) : (DestroyVehicle(BuildVehicle), BuildCreatedVehicle = 0x00); } } return 1; } //*============================================================================= public OnPlayerKeyStateChange(playerid, newkeys, oldkeys) { if(newkeys & KEY_FIRE) { if(BuildRace == playerid+1) { if(BuildTakeVehPos == true) { if(!IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, RED, ">> Usted Nesesita estar en un vehiculo"); new string[64], rFile[64], Float: vPos[4] ; //*============================================================================= format(rFile, sizeof(rFile), "/rRaceSystem/%s.RRACE", BuildName); GetVehiclePos(GetPlayerVehicleID(playerid), vPos[0], vPos[1], vPos[2]); GetVehicleZAngle(GetPlayerVehicleID(playerid), vPos[3]); dini_Create(rFile); dini_IntSet(rFile, "vModel", BuildModeVID); dini_IntSet(rFile, "rType", BuildRaceType); format(string, sizeof(string), "vPosX_%d", BuildVehPosCount), dini_FloatSet(rFile, string, vPos[0]); format(string, sizeof(string), "vPosY_%d", BuildVehPosCount), dini_FloatSet(rFile, string, vPos[1]); format(string, sizeof(string), "vPosZ_%d", BuildVehPosCount), dini_FloatSet(rFile, string, vPos[2]); format(string, sizeof(string), "vAngle_%d", BuildVehPosCount), dini_FloatSet(rFile, string, vPos[3]); format(string, sizeof(string), ">> Vehicle Pos '%d' has been taken.", BuildVehPosCount+1); SendClientMessage(playerid, YELLOW, string); BuildVehPosCount++; } //*============================================================================= if(BuildVehPosCount >= 2) { BuildVehPosCount = 0; BuildTakeVehPos = false; ShowDialog(playerid, 605); } if(BuildTakeCheckpoints == true) { if(BuildCheckPointCount > MAX_RACE_CHECKPOINTS_EACH_RACE) return SendClientMessage(playerid, RED, ">> Usted llegу a la mбxima cantidad de puntos de control!"); if(!IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, RED, ">> Usted necesita estar en un vehнculo"); new string[64], rFile[64], Float: vPos[3] ; format(rFile, sizeof(rFile), "/rRaceSystem/%s.RRACE", BuildName); GetVehiclePos(GetPlayerVehicleID(playerid), vPos[0], vPos[1], vPos[2]); format(string, sizeof(string), "CP_%d_PosX", BuildCheckPointCount), dini_FloatSet(rFile, string, vPos[0]); format(string, sizeof(string), "CP_%d_PosY", BuildCheckPointCount), dini_FloatSet(rFile, string, vPos[1]); format(string, sizeof(string), "CP_%d_PosZ", BuildCheckPointCount), dini_FloatSet(rFile, string, vPos[2]); format(string, sizeof(string), ">> Checkpoint '%d' has been setted!", BuildCheckPointCount+1); SendClientMessage(playerid, YELLOW, string); BuildCheckPointCount++; } } } //*============================================================================= if(newkeys & KEY_SECONDARY_ATTACK) { if(BuildTakeCheckpoints == true) { ShowDialog(playerid, 606); new rFile[64] ; format(rFile, sizeof(rFile), "/rRaceSystem/%s.RRACE", BuildName); dini_IntSet(rFile, "TotalCP", BuildCheckPointCount); } } return 1; } //*============================================================================= function LoadRace(playerid, rName[]) { new rFile[64], string[64] ; format(rFile, sizeof(rFile), "/rRaceSystem/%s.RRACE", rName); if(!dini_Exists(rFile)) return SendClientMessage(playerid, RED, "<!> La carrera no existe!"), printf("Carrera \"%s\" no existe!", rName); strmid(RaceName, rName, 0, strlen(rName), sizeof(RaceName)); RaceVehicle = dini_Int(rFile, "vModel"); RaceType = dini_Int(rFile, "rType"); TotalCP = dini_Int(rFile, "TotalCP"); //*============================================================================= #if DEBUG_RACE == 1 printf("VehicleModel: %d", RaceVehicle); printf("RaceType: %d", RaceType); printf("TotalCheckpoints: %d", TotalCP); #endif Loop(x, 2) { format(string, sizeof(string), "vPosX_%d", x), RaceVehCoords[0][x] = dini_Float(rFile, string); format(string, sizeof(string), "vPosY_%d", x), RaceVehCoords[1][x] = dini_Float(rFile, string); format(string, sizeof(string), "vPosZ_%d", x), RaceVehCoords[2][x] = dini_Float(rFile, string); format(string, sizeof(string), "vAngle_%d", x), RaceVehCoords[3][x] = dini_Float(rFile, string); #if DEBUG_RACE == 1 printf("VehiclePos %d: %f, %f, %f, %f", x, RaceVehCoords[0][x], RaceVehCoords[1][x], RaceVehCoords[2][x], RaceVehCoords[3][x]); #endif } Loop(x, TotalCP) { format(string, sizeof(string), "CP_%d_PosX", x), CPCoords[0][x] = dini_Float(rFile, string); format(string, sizeof(string), "CP_%d_PosY", x), CPCoords[1][x] = dini_Float(rFile, string); format(string, sizeof(string), "CP_%d_PosZ", x), CPCoords[2][x] = dini_Float(rFile, string); #if DEBUG_RACE == 1 printf("RaceCheckPoint %d: %f, %f, %f", x, CPCoords[0][x], CPCoords[1][x], CPCoords[2][x]); #endif } Position = 0; FinishCount = 0; JoinCount = 0; Loop(x, 2) PlayersCount[x] = 0; Joined[playerid] = true; CountAmount = COUNT_DOWN_TILL_RACE_START; RaceTime = MAX_RACE_TIME; RaceBusy = 0x01; SetupRaceForPlayer(playerid); CountTimer = SetTimer("CountTillRace", 999, 1); return 1; } //*============================================================================= function SetCP(playerid, PrevCP, NextCP, MaxCP, Type) { if(Type == 0) { if(NextCP == MaxCP) SetPlayerRaceCheckpoint(playerid, 1, CPCoords[0][PrevCP], CPCoords[1][PrevCP], CPCoords[2][PrevCP], CPCoords[0][NextCP], CPCoords[1][NextCP], CPCoords[2][NextCP], RACE_CHECKPOINT_SIZE); else SetPlayerRaceCheckpoint(playerid, 0, CPCoords[0][PrevCP], CPCoords[1][PrevCP], CPCoords[2][PrevCP], CPCoords[0][NextCP], CPCoords[1][NextCP], CPCoords[2][NextCP], RACE_CHECKPOINT_SIZE); } else if(Type == 3) { if(NextCP == MaxCP) SetPlayerRaceCheckpoint(playerid, 4, CPCoords[0][PrevCP], CPCoords[1][PrevCP], CPCoords[2][PrevCP], CPCoords[0][NextCP], CPCoords[1][NextCP], CPCoords[2][NextCP], RACE_CHECKPOINT_SIZE); else SetPlayerRaceCheckpoint(playerid, 3, CPCoords[0][PrevCP], CPCoords[1][PrevCP], CPCoords[2][PrevCP], CPCoords[0][NextCP], CPCoords[1][NextCP], CPCoords[2][NextCP], RACE_CHECKPOINT_SIZE); } return 1; } //*============================================================================= function SetupRaceForPlayer(playerid) { CPProgess[playerid] = 0; TogglePlayerControllable(playerid, false); CPCoords[3][playerid] = 0; SetCP(playerid, CPProgess[playerid], CPProgess[playerid]+1, TotalCP, RaceType); if(IsOdd(playerid)) Index = 1; else Index = 0; switch(Index) { case 0: { if(PlayersCount[0] == 1) { RaceVehCoords[0][0] -= (6 * floatsin(-RaceVehCoords[3][0], degrees)); RaceVehCoords[1][0] -= (6 * floatcos(-RaceVehCoords[3][0], degrees)); CreatedRaceVeh[playerid] = CreateVehicle(RaceVehicle, RaceVehCoords[0][0], RaceVehCoords[1][0], RaceVehCoords[2][0]+1, RaceVehCoords[3][0], random(126), random(126), (60 * 60)); SetPlayerPos(playerid, RaceVehCoords[0][0], RaceVehCoords[1][0], RaceVehCoords[2][0]+2); SetPlayerFacingAngle(playerid, RaceVehCoords[3][0]); PutPlayerInVehicle(playerid, CreatedRaceVeh[playerid], 0); Camera(playerid, RaceVehCoords[0][0], RaceVehCoords[1][0], RaceVehCoords[2][0], RaceVehCoords[3][0], 20); } } case 1: { //*============================================================================= if(PlayersCount[1] == 1) { RaceVehCoords[0][1] -= (6 * floatsin(-RaceVehCoords[3][1], degrees)); RaceVehCoords[1][1] -= (6 * floatcos(-RaceVehCoords[3][1], degrees)); CreatedRaceVeh[playerid] = CreateVehicle(RaceVehicle, RaceVehCoords[0][1], RaceVehCoords[1][1], RaceVehCoords[2][1]+1, RaceVehCoords[3][1], random(126), random(126), (60 * 60)); SetPlayerPos(playerid, RaceVehCoords[0][1], RaceVehCoords[1][1], RaceVehCoords[2][1]+2); SetPlayerFacingAngle(playerid, RaceVehCoords[3][1]); PutPlayerInVehicle(playerid, CreatedRaceVeh[playerid], 0); Camera(playerid, RaceVehCoords[0][1], RaceVehCoords[1][1], RaceVehCoords[2][1], RaceVehCoords[3][1], 20); } } } switch(Index) { case 0: { //*============================================================================= if(PlayersCount[0] != 1) { CreatedRaceVeh[playerid] = CreateVehicle(RaceVehicle, RaceVehCoords[0][0], RaceVehCoords[1][0], RaceVehCoords[2][0]+1, RaceVehCoords[3][0], random(126), random(126), (60 * 60)); SetPlayerPos(playerid, RaceVehCoords[0][0], RaceVehCoords[1][0], RaceVehCoords[2][0]+2); SetPlayerFacingAngle(playerid, RaceVehCoords[3][0]); PutPlayerInVehicle(playerid, CreatedRaceVeh[playerid], 0); Camera(playerid, RaceVehCoords[0][0], RaceVehCoords[1][0], RaceVehCoords[2][0], RaceVehCoords[3][0], 20); PlayersCount[0] = 1; } } case 1: { if(PlayersCount[1] != 1) { CreatedRaceVeh[playerid] = CreateVehicle(RaceVehicle, RaceVehCoords[0][1], RaceVehCoords[1][1], RaceVehCoords[2][1]+1, RaceVehCoords[3][1], random(126), random(126), (60 * 60)); SetPlayerPos(playerid, RaceVehCoords[0][1], RaceVehCoords[1][1], RaceVehCoords[2][1]+2); SetPlayerFacingAngle(playerid, RaceVehCoords[3][1]); PutPlayerInVehicle(playerid, CreatedRaceVeh[playerid], 0); Camera(playerid, RaceVehCoords[0][1], RaceVehCoords[1][1], RaceVehCoords[2][1], RaceVehCoords[3][1], 20); PlayersCount[1] = 1; } } } new string[128] ; InfoTimer[playerid] = SetTimerEx("TextInfo", 500, 1, "e", playerid); 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 st", RaceName, CPProgess[playerid], TotalCP, TimeConvert(RaceTime)); 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 th", RaceName, CPProgess[playerid], TotalCP, TimeConvert(RaceTime), RacePosition[playerid], JoinCount); TextDrawSetString(RaceInfo[playerid], string); TextDrawShowForPlayer(playerid, RaceInfo[playerid]); JoinCount++; return 1; } //*============================================================================= function CountTillRace() { switch(CountAmount) { case 0: { ForEach(i, MAX_PLAYERS) { if(Joined[i] == false) { new string[128] ; format(string, sizeof(string), ">> No se puede unir a \"%s\" llamado carrera mбs. Join time is over!", RaceName); SendClientMessage(i, RED, string); } } StartRace(); } case 1..5: { new string[10] ; format(string, sizeof(string), "~b~%d", CountAmount); ForEach(i, MAX_PLAYERS) { if(Joined[i] == true) { GameTextForPlayer(i, string, 999, 5); PlayerPlaySound(i, 1056, 0.0, 0.0, 0.0); } } } case 60, 50, 40, 30, 20, 10: { new string[128] ; format(string, sizeof(string), ">> \"%d\" segundos \"%s\" carrera comienza! Type \"/joinrace\" para entrar a la carrera.", CountAmount, RaceName); SendClientMessageToAll(GREEN, string); } } return CountAmount--; } //*============================================================================= function StartRace() { ForEach(i, MAX_PLAYERS) { if(Joined[i] == true) { TogglePlayerControllable(i, true); PlayerPlaySound(i, 1057, 0.0, 0.0, 0.0); GameTextForPlayer(i, "~g~GO GO GO", 2000, 5); SetCameraBehindPlayer(i); } } rCounter = SetTimer("RaceCounter", 900, 1); RaceTick = GetTickCount(); RaceStarted = 1; KillTimer(CountTimer); return 1; } //*============================================================================= function StopRace() { KillTimer(rCounter); RaceStarted = 0; RaceTick = 0; RaceBusy = 0x00; JoinCount = 0; FinishCount = 0; ForEach(i, MAX_PLAYERS) { if(Joined[i] == true) { DisablePlayerRaceCheckpoint(i); DestroyVehicle(CreatedRaceVeh[i]); Joined[i] = false; TextDrawHideForPlayer(i, RaceInfo[i]); CPProgess[i] = 0; KillTimer(InfoTimer[i]); } } SendClientMessageToAll(GREEN, ">> Race time is over!"); return 1; } //*============================================================================= function RaceCounter() { if(RaceStarted == 1) RaceTime--; if(RaceTime <= 0) { StopRace(); } return 1; } //*============================================================================= function TextInfo(playerid) { new string[128] ; 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 st", RaceName, CPProgess[playerid], TotalCP, TimeConvert(RaceTime)); 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 th", RaceName, CPProgess[playerid], TotalCP, TimeConvert(RaceTime), RacePosition[playerid], JoinCount); TextDrawSetString(RaceInfo[playerid], string); TextDrawShowForPlayer(playerid, RaceInfo[playerid]); } //*============================================================================= function Camera(playerid, Float:X, Float:Y, Float:Z, Float:A, Mul) { SetPlayerCameraLookAt(playerid, X, Y, Z); SetPlayerCameraPos(playerid, X + (Mul * floatsin(-A, degrees)), Y + (Mul * floatcos(-A, degrees)), Z+6); } //*============================================================================= function IsPlayerInRace(playerid) { if(Joined[playerid] == true) return true; else return false; } //*============================================================================= function ShowDialog(playerid, dialogid) { switch(dialogid) { case 599: ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_LIST, CreateCaption("Build New Race"), "\ Normal Race\n\ Air Race", "Next", "Exit"); case 600: ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_INPUT, CreateCaption("Build New Race (Step 1/4)"), "\ Step 1:\n\ *******\n\ Welcome to wizard 'Build New Race'.\n\ Before getting started, I need to know the name (e.g. SFRace) of the to save it under.\n\n\ >> Give the NAME below and press 'Next' to continue.", "Next", "Back"); case 601: ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_INPUT, CreateCaption("Build New Race (Step 1/4)"), "\ ERROR: Name too short or too long! (min. 1 - max. 20)\n\n\n\ Step 1:\n\ ********\n\ Welcome to wizard 'Build New Race'.\n\ Before getting started, I need to know the name (e.g. SFRace) of the to save it under.\n\n\ >> Give the NAME below and press 'Next' to continue.", "Next", "Back"); case 602: ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_INPUT, CreateCaption("Build New Race (Step 2/4)"), "\ Step 2:\n\ ********\n\ Please give the ID or NAME of the vehicle that's going to be used in the race you are creating now.\n\n\ >> Give the ID or NAME of the vehicle below and press 'Next' to continue. 'Back' to change something.", "Next", "Back"); case 603: ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_INPUT, CreateCaption("Build New Race (Step 2/4)"), "\ ERROR: Invalid Vehilce ID/Name\n\n\n\ Step 2:\n\ ********\n\ Please give the ID or NAME of the vehicle that's going to be used in the race you are creating now.\n\n\ >> Give the ID or NAME of the vehicle below and press 'Next' to continue. 'Back' to change something.", "Next", "Back"); case 604: ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_MSGBOX, CreateCaption("Build New Race (Step 3/4)"), "\ Step 3:\n\ ********\n\ We are almost done! Now go to the start line where the first and second car should stand.\n\ Note: When you click 'OK' you will be free. Use 'KEY_FIRE' to set the first position and second position.\n\ Note: After you got these positions you will automaticly see a dialog to continue the wizard.\n\n\ >> Press 'OK' to do the things above. 'Back' to change something.", "OK", "Back"); case 605: ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_MSGBOX, CreateCaption("Build New Race (Step 4/4)"), "\ Step 4:\n\ ********\n\ Welcome to the last stap. In this stap you have to set the checkpoints; so if you click 'OK' you can set the checkpoints.\n\ You can set the checkpoints with 'KEY_FIRE'. Each checkpoint you set will save.\n\ You have to press 'ENTER' button when you're done with everything. You race is aviable then!\n\n\ >> Press 'OK' to do the things above. 'Back' to change something.", "OK", "Back"); case 606: ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_MSGBOX, CreateCaption("Build New Race (Done)"), "\ You have created your race and it's ready to use now.\n\n\ >> Press 'Finish' to finish. 'Exit' - Has no effect.", "Finish", "Exit"); } return 1; } //*============================================================================= CreateCaption(arguments[]) { new string[128 char] ; format(string, sizeof(string), "RyDeR's Race System - %s", arguments); return string; } //*============================================================================= stock IsValidVehicle(vehicleid) { if(vehicleid < 400 || vehicleid > 611) return false; else return true; } //*============================================================================= ReturnVehicleID(vName[]) { Loop(x, 211) { if(strfind(vNames[x], vName, true) != -1) return x + 400; } return -1; } //*============================================================================= TimeConvert(seconds) { new tmp[16]; new minutes = floatround(seconds/60); seconds -= minutes*60; format(tmp, sizeof(tmp), "%d:%02d", minutes, seconds); return tmp; }