14.09.2016, 05:27
Necesito ayuda en un sistema de races.. quiero que cuando ponga la race , salga el mejor corredor y el tiempo,,.. tengo uno pero aveces se bugea D: ayudanme
Imagen de lo que quiero
![](http://forum.sa-mp.com/attachment.php?attachmentid=8075&d=1409233070)
Mi codigo
Imagen de lo que quiero
Mi codigo
Код:
#include <a_samp> #include <dini> #include <zcmd> #define Azul 0x375FFFFF #define Rojo 0xFF0000FF #define Amarillo 0xFFFF00AA #define Verde 0x00FF00FF #pragma tabsize 0 #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 \ 120 #define MAX_RACES \ 100 #define COUNT_DOWN_TILL_RACE_START \ 40 // seconds #define MAX_RACE_TIME \ 300 // seconds #define RACE_CHECKPOINT_SIZE \ 12.0 #define DEBUG_RACE \ 0 //#define green 0x33FF33AA new string2[256]; new BuildRace, BuildRaceType, BuildVehicle, BuildCreatedVehicle, BuildModeVID, BuildName[30], bool: BuildTakeVehPos, BuildVehPosCount, bool: BuildTakeCheckpoints, BuildCheckPointCount, RaceBusy = 0x00, RaceName[30], RaceVehicle, RaceType, TotalCP, Float: RaceVehCoords[2][4], Float: CPCoords[MAX_RACE_CHECKPOINTS_EACH_RACE][4], 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], RaceNames[MAX_RACES][128], TotalRaces, bool: AutomaticRace, TimeProgress, VehicleNames[212][] = { "Landstalker","Bravura","Buffalo","Linerunner","Pereniel","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","Previon","Coach","Cabbie", "Stallion","Rumpo","RC Bandit","Romero","Packer","Monster","Admiral","Squalo","Seasparrow","Pizzaboy","Tram","Trailer","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","ZR3 50","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","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","Trailer", "Kart","Mower","Duneride","Sweeper","Broadway","Tornado","AT-400","DFT-30","Huntley","Stafford","BF-400","Newsvan","Tug","Trailer A","Emperor", "Wayfarer","Euros","Hotdog","Club","Trailer B","Trailer C","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" }; main() { print("\n----------------------------------"); print(" Blank Gamemode by your name here"); print("----------------------------------\n"); } public OnFilterScriptInit() { print("\n----------------------------------"); print(" Blank Gamemode by your name here"); print("----------------------------------\n"); 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; AutomaticRace = false; return 1; } public OnFilterScriptExit() { return 1; } public OnPlayerDeath(playerid, killerid, reason) { if(Joined[playerid] == true) { JoinCount--; Joined[playerid] = false; DestroyVehicle(CreatedRaceVeh[playerid]); DisablePlayerRaceCheckpoint(playerid); CPProgess[playerid] = 0; KillTimer(InfoTimer[playerid]); #if defined RACE_IN_OTHER_WORLD SetPlayerVirtualWorld(playerid, 0); #endif } if(BuildRace == playerid+1) BuildRace = 0; return 1; } //Comandos rRace CMD:armarcarrera(playerid, params[]) { if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, Rojo, "<!> You are not an administrator!"); if(BuildRace != 0) return SendClientMessage(playerid, Rojo, "<!> There's already someone building a race!"); if(RaceBusy == 0x01) return SendClientMessage(playerid, Rojo, "<!> Wait first till race ends!"); if(IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, Rojo, "<!> Please leave your vehicle first!"); BuildRace = playerid+1; ShowDialog(playerid, 599); return 1; } CMD:abrircarrera(playerid, params[]) { if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, Rojo, "<!> You are not an administrator!"); if(AutomaticRace == true) return SendClientMessage(playerid, Rojo, "<!> Not possible. Automatic race is enabled!"); if(BuildRace != 0) return SendClientMessage(playerid, Rojo, "<!> There's someone building a race!"); if(RaceBusy == 0x01 || RaceStarted == 1) return SendClientMessage(playerid, Rojo, "<!> There's a race currently. Wait first till race ends!"); if(isnull(params)) return SendClientMessage(playerid, Rojo, "<!> /loadrace [nombre]"); LoadRace(playerid, params); return 1; } CMD:pararcarrera(playerid, params[]) { if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, Rojo, "<!> You are not an administrator!"); if(RaceBusy == 0x00 || RaceStarted == 0) return SendClientMessage(playerid, Rojo, "<!> There's no race to stop!"); return StopRace(); } CMD:join(playerid, params[]) { if(RaceStarted == 1) return SendClientMessage(playerid, Rojo, "<!> La Carrera ya empeso! Espera que termine!"); if(RaceBusy == 0x00) return SendClientMessage(playerid, Rojo, "<!> No hay carreras para entrar!"); if(Joined[playerid] == true) return SendClientMessage(playerid, Rojo, "<!> Has Entrado a la carrera!"); if(IsPlayerInAnyVehicle(playerid)) return SetTimerEx("SetupRaceForPlayer", 2500, 0, "e", playerid), RemovePlayerFromVehicle(playerid), Joined[playerid] = true; SetupRaceForPlayer(playerid); ResetPlayerWeapons(playerid); Joined[playerid] = true; return 1; } CMD:carrerason(playerid, params[]) { if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, Rojo, "<!> You are not an administrator!"); if(RaceBusy == 0x01 || RaceStarted == 1) return SendClientMessage(playerid, Rojo, "<!> There's a race currently. Wait first till race ends!"); if(AutomaticRace == true) return SendClientMessage(playerid, Rojo, "<!> It's already enabled!"); LoadRaceNames(); LoadAutoRace(RaceNames[random(TotalRaces)]); AutomaticRace = true; SendClientMessage(playerid, Verde, ">> You staRojo auto race. The filterscript will start a random race everytime the previous race is over!"); return 1; } CMD:carrerasoff(playerid, params[]) { if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, Rojo, "<!> You are not an administrator!"); if(AutomaticRace == false) return SendClientMessage(playerid, Rojo, "<!> It's already disabled!"); AutomaticRace = false; return 1; } CMD:exit(playerid, params[]) { if(Joined[playerid] == true) { JoinCount--; Joined[playerid] = false; DestroyVehicle(CreatedRaceVeh[playerid]); DisablePlayerRaceCheckpoint(playerid); //TextDrawHideForPlayer(playerid, RaceInfo[playerid]); CPProgess[playerid] = 0; KillTimer(InfoTimer[playerid]); TogglePlayerControllable(playerid, true); SetCameraBehindPlayer(playerid); #if defined RACE_IN_OTHER_WORLD SetPlayerVirtualWorld(playerid, 0); #endif SpawnPlayer(playerid); SetCameraBehindPlayer(playerid); } else return SendClientMessage(playerid, Rojo, "<!> No estas en una carrera!"); return 1; } public OnPlayerEnterRaceCheckpoint(playerid) { if(CPProgess[playerid] == TotalCP -1) { new TimeStamp, TotalRaceTime, rFile[256], string[256], pName[MAX_PLAYER_NAME], rTime[3], Prize[2], TempTotalTime, TempTime[3] ; Position++; 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 Termino la carrera en la posicion %d de %d jugadores, Tiempo %d:%d.%d.", pName, RacePosition[playerid], JoinCount, rTime[0], rTime[1], rTime[2]); SendClientMessageToAll(Amarillo, string); new stringxd[400]; format(stringxd, sizeof(stringxd), "~b~~h~~h~tiempo:~w~ %d:%d.%d ~b~~h~~h~- ganancia:~w~$%d~n~~b~~h~~h~score:~w~+%d", rTime[0], rTime[1], rTime[2], Prize[0],Prize[1]); GameTextForPlayer(playerid,stringxd,9000,3); if(FinishCount <= 5) { format(rFile, sizeof(rFile), "/rRaceSystem/%s.RRACE", RaceName); format(string2, sizeof(string2), "BestRacerTime_%d", TimeProgress); TempTotalTime = dini_Int(rFile, string2); ConvertTime(var1, TempTotalTime, TempTime[0], TempTime[1], TempTime[2]); if(TotalRaceTime <= dini_Int(rFile, string2) || TempTotalTime == 0) { dini_IntSet(rFile, string2, TotalRaceTime); format(string2, sizeof(string2), "BestRacer_%d", TimeProgress); if(TempTotalTime != 0) format(string2, sizeof(string2), "** \"%s\" rompiу el record de \"%s\" con \"%d\" segundos mбs rбpido en la \"%d\"!", pName, dini_Get(rFile, string2), -(rTime[1] - TempTime[1]), TimeProgress+1); else format(string2, sizeof(string2), "**\"%s\" rompiу un nuevo record en la \"%d\"' posiciуn!", pName, TimeProgress+1); SendClientMessageToAll(0x0000FFFF, string2); format(string2, sizeof(string2), "BestRacer_%d", TimeProgress); dini_Set(rFile, string2, pName); TimeProgress++; } } SetCameraBehindPlayer(playerid); FinishCount++; GivePlayerMoney(playerid, Prize[0]); SetPlayerScore(playerid, GetPlayerScore(playerid) + Prize[1]); DisablePlayerRaceCheckpoint(playerid); CPProgess[playerid]++; if(FinishCount >= JoinCount) return StopRace(); } else { CPProgess[playerid]++; CPCoords[CPProgess[playerid]][3]++; RacePosition[playerid] = floatround(CPCoords[CPProgess[playerid]][3], floatround_floor); SetCP(playerid, CPProgess[playerid], CPProgess[playerid]+1, TotalCP, RaceType); new stringxd[400]; format(stringxd, sizeof(stringxd), "~n~~n~~n~~n~~n~~n~~n~~n~~n~~n~~b~~h~~h~checkpoint:~w~ %d/%d",CPProgess[playerid]+1, TotalCP); GameTextForPlayer(playerid,stringxd,2000,3); PlayerPlaySound(playerid, 1137, 0.0, 0.0, 0.0); } return 1; } public OnPlayerKeyStateChange(playerid, newkeys, oldkeys) { new string[256], rNameFile[256], rFile[256], Float: vPos[4] ; if(newkeys & KEY_FIRE) { if(BuildRace == playerid+1) { if(BuildTakeVehPos == true) { if(!IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, Rojo, ">> You need to be in a vehicle"); 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), ">> Posicion del Vehiculo N° '%d' Bien Puesta!.", BuildVehPosCount+1); SendClientMessage(playerid, Amarillo, 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, Rojo, ">> You reached the maximum amount of checkpoints!"); if(!IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, Rojo, ">> You need to be in a vehicle"); 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' Bien Colocado!", BuildCheckPointCount+1); SendClientMessage(playerid, Amarillo, string); BuildCheckPointCount++; } } } if(newkeys & KEY_SECONDARY_ATTACK) { if(BuildTakeCheckpoints == true) { ShowDialog(playerid, 606); format(rNameFile, sizeof(rNameFile), "/rRaceSystem/RaceNames/RaceNames.txt"); TotalRaces = dini_Int(rNameFile, "TotalRaces"); TotalRaces++; dini_IntSet(rNameFile, "TotalRaces", TotalRaces); format(string, sizeof(string), "Race_%d", TotalRaces-1); format(rFile, sizeof(rFile), "/rRaceSystem/%s.RRACE", BuildName); dini_Set(rNameFile, string, BuildName); dini_IntSet(rFile, "TotalCP", BuildCheckPointCount); Loop(x, 5) { format(string, sizeof(string), "BestRacerTime_%d", x); dini_Set(rFile, string, "0"); format(string, sizeof(string), "BestRacer_%d", x); dini_Set(rFile, string, "noone"); } } } 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, Verde, ">> Ir a la lнnea de salida en la carretera a la izquierda y pulse 'KEY_FIRE' y hacer lo mismo con la Derecha!."); SendClientMessage(playerid, Verde, " - When this is done, you will see a dialog to continue."); BuildVehPosCount = 0; BuildTakeVehPos = true; } case 605: { if(!response) return ShowDialog(playerid, 604); SendClientMessage(playerid, Verde, ">> Comience a tomar los puestos de control ahora haciendo click 'KEY_FIRE'."); SendClientMessage(playerid, Verde, " - Presione 'ENTER' cuando haya terminado con los puntos de control: IMPORTANTE! Si no reacciona de aprete otra vez."); 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; } stock Float:GetDistanceBetweenPlayers(p1,p2) { new Float:x1,Float:y1,Float:z1,Float:x2,Float:y2,Float:z2; if (!IsPlayerConnected(p1) || !IsPlayerConnected(p2)){ return -1.00; } GetPlayerPos(p1,x1,y1,z1); GetPlayerPos(p2,x2,y2,z2); return floatsqroot(floatpower(floatabs(floatsub(x2,x1)),2)+floatpower(floatabs(floatsub(y2,y1)),2)+floatpower(floatabs(floatsub(z2,z1)),2)); } stock GetModel(weaponid) { for(new i=0; i<sizeof(ForbiddenWeapons); i++) { if(weaponid == ForbiddenWeapons[i]) { return -1; } } switch(weaponid) { case 1: return 331;case 2: return 333;case 3: return 334; case 4: return 335;case 5: return 336;case 6: return 337; case 7: return 338;case 8: return 339;case 9: return 341;case 10: return 321; case 11: return 322;case 12: return 323;case 13: return 324; case 14: return 325; case 15: return 326;case 16: return 342; case 17: return 343; case 18: return 344;case 22: return 346; case 23: return 347;case 24: return 348; case 25: return 349; case 26: return 350;case 27: return 351;case 28: return 352; case 29: return 353;case 30: return 355;case 31: return 356;case 32: return 372;case 33: return 357;case 34: return 358;case 35: return 359; case 36: return 360;case 37: return 361;case 38: return 362;case 39: return 363; case 40: return 364;case 41: return 365;case 42: return 366;case 43: return 367; case 44: return 368;case 45: return 369;case 46: return 371;default: return -1; } return -1; } function LoadRaceNames() { new rNameFile[64], string[64] ; format(rNameFile, sizeof(rNameFile), "/rRaceSystem/RaceNames/RaceNames.txt"); TotalRaces = dini_Int(rNameFile, "TotalRaces"); Loop(x, TotalRaces) { format(string, sizeof(string), "Race_%d", x), strmid(RaceNames[x], dini_Get(rNameFile, string), 0, 20, sizeof(RaceNames)); printf(">> Loaded Races: %s", RaceNames[x]); } TimeProgress = 0; return 1; } function LoadAutoRace(rName[]) { new rFile[256], string[256] ; format(rFile, sizeof(rFile), "/rRaceSystem/%s.RRACE", rName); if(!dini_Exists(rFile)) return printf("Race \"%s\" doesn't exist!", 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[x][0] = dini_Float(rFile, string); format(string, sizeof(string), "vPosY_%d", x), RaceVehCoords[x][1] = dini_Float(rFile, string); format(string, sizeof(string), "vPosZ_%d", x), RaceVehCoords[x][2] = dini_Float(rFile, string); format(string, sizeof(string), "vAngle_%d", x), RaceVehCoords[x][3] = dini_Float(rFile, string); #if DEBUG_RACE == 1 //printf("VehiclePos %d: %f, %f, %f, %f", x, RaceVehCoords[x][0], RaceVehCoords[x][1], RaceVehCoords[x][2], RaceVehCoords[x][3]); #endif } Loop(x, TotalCP) { format(string, sizeof(string), "CP_%d_PosX", x), CPCoords[x][0] = dini_Float(rFile, string); format(string, sizeof(string), "CP_%d_PosY", x), CPCoords[x][1] = dini_Float(rFile, string); format(string, sizeof(string), "CP_%d_PosZ", x), CPCoords[x][2] = dini_Float(rFile, string); #if DEBUG_RACE == 1 //printf("RaceCheckPoint %d: %f, %f, %f", x, CPCoords[x][0], CPCoords[x][1], CPCoords[x][2]); #endif } Position = 0; FinishCount = 0; JoinCount = 0; Loop(x, 2) PlayersCount[x] = 0; CountAmount = COUNT_DOWN_TILL_RACE_START; RaceTime = MAX_RACE_TIME; RaceBusy = 0x01; CountTimer = SetTimer("CountTillRace", 999, 1); TimeProgress = 0; return 1; } function LoadRace(playerid, rName[]) { new rFile[256], string[256] ; format(rFile, sizeof(rFile), "/rRaceSystem/%s.RRACE", rName); if(!dini_Exists(rFile)) return SendClientMessage(playerid, Rojo, "<!> Race doesn't exist!"), printf("Race \"%s\" doesn't exist!", 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[x][0] = dini_Float(rFile, string); format(string, sizeof(string), "vPosY_%d", x), RaceVehCoords[x][1] = dini_Float(rFile, string); format(string, sizeof(string), "vPosZ_%d", x), RaceVehCoords[x][2] = dini_Float(rFile, string); format(string, sizeof(string), "vAngle_%d", x), RaceVehCoords[x][3] = dini_Float(rFile, string); #if DEBUG_RACE == 1 //printf("VehiclePos %d: %f, %f, %f, %f", x, RaceVehCoords[x][0], RaceVehCoords[x][1], RaceVehCoords[x][2], RaceVehCoords[x][3]); #endif } Loop(x, TotalCP) { format(string, sizeof(string), "CP_%d_PosX", x), CPCoords[x][0] = dini_Float(rFile, string); format(string, sizeof(string), "CP_%d_PosY", x), CPCoords[x][1] = dini_Float(rFile, string); format(string, sizeof(string), "CP_%d_PosZ", x), CPCoords[x][2] = dini_Float(rFile, string); #if DEBUG_RACE == 1 //printf("RaceCheckPoint %d: %f, %f, %f", x, CPCoords[x][0], CPCoords[x][1], CPCoords[x][2]); #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; // TimeProgress = 0; 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[PrevCP][0], CPCoords[PrevCP][1], CPCoords[PrevCP][2], CPCoords[NextCP][0], CPCoords[NextCP][1], CPCoords[NextCP][2], RACE_CHECKPOINT_SIZE); 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); } else if(Type == 3) { 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); 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); } return 1; } function SetupRaceForPlayer(playerid) { CPProgess[playerid] = 0; TogglePlayerControllable(playerid, false); CPCoords[playerid][3] = 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[0][3], degrees)); RaceVehCoords[0][1] -= (6 * floatcos(-RaceVehCoords[0][3], degrees)); CreatedRaceVeh[playerid] = CreateVehicle(RaceVehicle, RaceVehCoords[0][0], RaceVehCoords[0][1], RaceVehCoords[0][2]+2, RaceVehCoords[0][3], random(126), random(126), (60 * 60)); SetPlayerPos(playerid, RaceVehCoords[0][0], RaceVehCoords[0][1], RaceVehCoords[0][2]+2); SetPlayerFacingAngle(playerid, RaceVehCoords[0][3]); PutPlayerInVehicle(playerid, CreatedRaceVeh[playerid], 0); SendClientMessage(playerid, 0xFFFF00AA, " "); SendClientMessage(playerid, 0xFFFF00AA, "* Estas congelado, cuando termine la cuenta regresiva podrбs comenzar"); SendClientMessage(playerid, 0xFFFF00AA, "A correr contra los competidores por el primer puesto, Dinero y Score!"); SendClientMessage(playerid, 0xFFFF00AA, "AutoFix Activado (Vehiculo indestructible) y Turbo Desactivado"); Camera(playerid, RaceVehCoords[0][0], RaceVehCoords[0][1], RaceVehCoords[0][2], RaceVehCoords[0][3], 20); } } case 1: { if(PlayersCount[1] == 1) { RaceVehCoords[1][0] -= (6 * floatsin(-RaceVehCoords[1][3], degrees)); RaceVehCoords[1][1] -= (6 * floatcos(-RaceVehCoords[1][3], degrees)); CreatedRaceVeh[playerid] = CreateVehicle(RaceVehicle, RaceVehCoords[1][0], RaceVehCoords[1][1], RaceVehCoords[1][2]+2, RaceVehCoords[1][3], random(126), random(126), (60 * 60)); SetPlayerPos(playerid, RaceVehCoords[1][0], RaceVehCoords[1][1], RaceVehCoords[1][2]+2); SetPlayerFacingAngle(playerid, RaceVehCoords[1][3]); PutPlayerInVehicle(playerid, CreatedRaceVeh[playerid], 0); SendClientMessage(playerid, 0xFFFF00AA, " "); SendClientMessage(playerid, 0xFFFF00AA, "* Estas congelado, cuando termine la cuenta regresiva podrбs comenzar"); SendClientMessage(playerid, 0xFFFF00AA, "A correr contra los competidores por el primer puesto, Dinero y Score!"); SendClientMessage(playerid, 0xFFFF00AA, "AutoFix Activado (Vehiculo indestructible) y Turbo Desactivado"); Camera(playerid, RaceVehCoords[1][0], RaceVehCoords[1][1], RaceVehCoords[1][2], RaceVehCoords[1][3], 20); } } } switch(Index) { case 0: { if(PlayersCount[0] != 1) { CreatedRaceVeh[playerid] = CreateVehicle(RaceVehicle, RaceVehCoords[0][0], RaceVehCoords[0][1], RaceVehCoords[0][2]+2, RaceVehCoords[0][3], random(126), random(126), (60 * 60)); SetPlayerPos(playerid, RaceVehCoords[0][0], RaceVehCoords[0][1], RaceVehCoords[0][2]+2); SetPlayerFacingAngle(playerid, RaceVehCoords[0][3]); PutPlayerInVehicle(playerid, CreatedRaceVeh[playerid], 0); SendClientMessage(playerid, 0xFFFF00AA, " "); SendClientMessage(playerid, 0xFFFF00AA, "* Estas congelado, cuando termine la cuenta regresiva podrбs comenzar"); SendClientMessage(playerid, 0xFFFF00AA, "A correr contra los competidores por el primer puesto, Dinero y Score!"); SendClientMessage(playerid, 0xFFFF00AA, "AutoFix Activado (Vehiculo indestructible) y Turbo Desactivado"); Camera(playerid, RaceVehCoords[0][0], RaceVehCoords[0][1], RaceVehCoords[0][2], RaceVehCoords[0][3], 20); PlayersCount[0] = 1; } } case 1: { if(PlayersCount[1] != 1) { CreatedRaceVeh[playerid] = CreateVehicle(RaceVehicle, RaceVehCoords[1][0], RaceVehCoords[1][1], RaceVehCoords[1][2]+2, RaceVehCoords[1][3], random(126), random(126), (60 * 60)); SetPlayerPos(playerid, RaceVehCoords[1][0], RaceVehCoords[1][1], RaceVehCoords[1][2]+2); SetPlayerFacingAngle(playerid, RaceVehCoords[1][3]); PutPlayerInVehicle(playerid, CreatedRaceVeh[playerid], 0); SendClientMessage(playerid, 0xFFFF00AA, " "); SendClientMessage(playerid, 0xFFFF00AA, "* Estas congelado, cuando termine la cuenta regresiva podrбs comenzar"); SendClientMessage(playerid, 0xFFFF00AA, "A correr contra los competidores por el primer puesto, Dinero y Score!"); SendClientMessage(playerid, 0xFFFF00AA, "AutoFix Activado (Vehiculo indestructible) y Turbo Desactivado"); Camera(playerid, RaceVehCoords[1][0], RaceVehCoords[1][1], RaceVehCoords[1][2], RaceVehCoords[1][3], 20); PlayersCount[1] = 1; } } } #if defined RACE_IN_OTHER_WORLD SetPlayerVirtualWorld(playerid, 10); #endif JoinCount++; return 1; } 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 CountTillRace() { switch(CountAmount) { case 0: { ForEach(i, MAX_PLAYERS) { if(Joined[i] == false) { } } StartRace(); } case 1..5: { new string[100] ; ForEach(i, MAX_PLAYERS) { if(Joined[i] == true) { SetCameraBehindPlayer(i); format(string, sizeof(string), "~G~~h~~h~%d!", CountAmount); } if(Joined[i] == true) { GameTextForPlayer(i, string, 999, 5); PlayerPlaySound(i, 1039, 0.0, 0.0, 0.0); } } } case 6..39: { new string[100] ; format(string, sizeof(string), "~n~~r~~h~~h~%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 40: { new string[128] ; SendClientMessageToAll(Verde, " "); format(string, sizeof(string), "{E1FF00}* Carrera {FFFFFF}\"%s\" {E1FF00}comienza en \"%d\" segundos!.", RaceName, CountAmount); SendClientMessageToAll(Verde, string); SendClientMessageToAll(Verde, "{E1FF00}Escribe {FFFFFF}/join {E1FF00}para participar en la carrera, Debes estar dentro de un vehнculo"); SendClientMessageToAll(Verde, "{E1FF00}Escribe {FFFFFF}/exit {E1FF00}para salir de la carrera, Spawnearas en tu Equipo-Spawn"); ForEach(i, MAX_PLAYERS) { } } } return CountAmount--; } function StartRace() { ForEach(i, MAX_PLAYERS) { if(Joined[i] == true) { TogglePlayerControllable(i, true); PlayerPlaySound(i, 1141, 0.0, 0.0, 0.0); GameTextForPlayer(i, "~b~~h~~h~ya ya ya!!!!", 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; TimeProgress = 0; ForEach(i, MAX_PLAYERS) { if(Joined[i] == true) { DisablePlayerRaceCheckpoint(i); DestroyVehicle(CreatedRaceVeh[i]); Joined[i] = false; CPProgess[i] = 0; KillTimer(InfoTimer[i]); } } //TextDrawDestroy(TextoAnuncioCarrera); if(AutomaticRace == true) LoadRaceNames(), LoadAutoRace(RaceNames[random(TotalRaces)]); return 1; } function RaceCounter() { if(RaceStarted == 1) { RaceTime--; if(JoinCount <= 0) { StopRace(); SendClientMessageToAll(Rojo, ">> Carrera terminу .. No queda nadie en la carrera!"); } } if(RaceTime <= 0) { StopRace(); } return 1; } 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("Creando una nueva carrera"), "\ Carrera Normal (en vehiculo)\n\ Carrera de aviones", "Siguiente", "Salir"); case 600: ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_INPUT, CreateCaption("Creando nueva carrera (Paso 1/4)"), "\ Paso 1:\n\ ********\n\ Bienvenido a 'Construccion de carreras'.\n\ Antes de comenzar debes ingresar el nombre que le quieres poner a la nueva carrera (EJ: SFRace)\n\n\ >> Luego de haberle puesto el nombre a tu carrera presiona 'Siguiente' para continuar.", "Siguiente", "Volver"); case 601: ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_INPUT, CreateCaption("Creando nueva carrera (Paso 1/4)"), "\ ERROR: el nombre que le pusiste a la carrera es muy corto o muy largo! (min. 1 - max. 20 letras)\n\n\n\ Paso 1:\n\ ********\n\ Bienvenido a 'Construccion de carreras'.\n\ Antes de comenzar debes ingresar el nombre que le quieres poner a la nueva carrera (EJ: SFRace)\n\n\ >> Luego de haberle puesto el nombre a tu carrera presiona 'Siguiente' para continuar.", "Siguiente", "Volver"); case 602: ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_INPUT, CreateCaption("Creando nueva carrera (Paso 2/4)"), "\ Paso 2:\n\ ********\n\ Ingresa la 'ID' o 'Nombre' del vehiculo que quieres que se utiliza en esta carrera.\n\n\ >> Luego de haber ingresado la 'ID' o el 'Nombre' presiona 'Siguiente' para continuar. 'Volver' para cambiar algo anterior.", "Siguiente", "Volver"); case 603: ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_INPUT, CreateCaption("Build New Race (Step 2/4)"), "\ ERROR: El nombre del vehiculo o la id que ingresaste no existe.\n\n\n\ Step 2:\n\ ********\n\ Ingresa la 'ID' o 'Nombre' del vehiculo que quieres que se utiliza en esta carrera.\n\n\ >> Luego de haber ingresado la 'ID' o el 'Nombre' presiona 'Siguiente' para continuar. 'Volver' para cambiar algo anterior.", "Siguiente", "Volver"); 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(VehicleNames[x], vName, true) != -1) return x + 400; } return -1; } stock IsNumeric(string[]) { for (new i = 0, j = strlen(string); i < j; i++) { if (string[i] > '9' || string[i] < '0') return 0; } return 1; } stock VehiculosInvalidos(modelo) { switch(GetVehicleModel(modelo)) { case 520, 432,476,593,553,513, 512,577,592,511,539,464,460,519, 548,425,417,487,497,563,501,465, 447,469,488,472,473,493,595,484, 430,453,452,446,454: return 1; } return 0; } stock ResetPlayerVarDisconnect(playerid) { if(Joined[playerid] == true) { JoinCount--; Joined[playerid] = false; DestroyVehicle(CreatedRaceVeh[playerid]); DisablePlayerRaceCheckpoint(playerid); //TextDrawHideForPlayer(playerid, RaceInfo[playerid]); CPProgess[playerid] = 0; KillTimer(InfoTimer[playerid]); #if defined RACE_IN_OTHER_WORLD SetPlayerVirtualWorld(playerid, 0); #endif } if(BuildRace == playerid+1) BuildRace = 0; return 1; }