· 8 years ago · Feb 12, 2018, 11:36 AM
1//====================== UFF Race System-========
2//============ By Oblivion (2018)=================
3
4//Includes
5#include <a_samp>
6#include <YSI\y_iterate>
7#include <YSI\y_timers>
8#include <zcmd>
9#include <streamer>
10
11// ----- Base de Datos -----
12#define sql_database "CarrerasLol.db"
13// ----- Definición de CallBacks ----
14#define CallBack:%0(%1) forward%0(%1); public%0(%1)
15// ---- Definición de Loops y macros
16#define Loop(%0,%1) \
17 for(new %0 = 0; %0 != %1; %0++)
18
19#define IsOdd(%1) \
20 ((%1) & 1)
21
22#define ConvertTime(%0,%1,%2,%3,%4) \
23 new \
24 Float: %0 = floatdiv(%1, 60000) \
25 ;\
26 %2 = floatround(%0, floatround_tozero); \
27 %3 = floatround(floatmul(%0 - %2, 60), floatround_tozero); \
28 %4 = floatround(floatmul(floatmul(%0 - %2, 60) - %3, 1000), floatround_tozero)
29// ---- Definición ajutes de carreras ----
30#define MAX_CP_POR_CARRERA 120
31#define CONTEO_INICIA_CARRERA 35 //Segundos
32#define MAX_TIEMPO_CARRERA 300 //Segundos
33#define CARRERA_CP_TAMAÑO 14.0
34// ---- Diálogos ----
35#define DIALOGO_SIN_USO 0
36#define DIALOGO_SERVER_DATOS 1
37#define DIALOGO_MAS_CARRERAS 2
38// ---- Colores ----
39#define COL_BLANCO "{FFFFFF}"
40#define COL_VERDE "{00FF00}"
41#define COL_AMARILLO "{FFFF00}"
42#define COL_ROJO "{FF0000}"
43
44#define COLOR_ROJO 0xFF0000AA
45#define COLOR_AMARILLO 0xFFFF00AA
46#define COLOR_AZUL 0x33CCFFAA
47// ---- Variables ----
48enum pInfo
49{
50// ScoreCarrera,
51 Consulta,
52 pID,
53 bool:EsCorredor,
54 CPProgess,
55 PosicionCarrera,
56 Timer:InfoTimer,
57 Vehiculo
58};
59new Usuario[MAX_PLAYERS][pInfo];
60
61new BuildRace,
62 BuildRaceType,
63 BuildModeVID = -1,
64 BuildName[30],
65 bool: BuildTakeVehPos,
66 BuildVehPosCount,
67 bool: BuildTakeCheckpoints,
68 BuildCheckPointCount,
69 RaceBusy = 0x00,
70 RaceName[30],
71 RaceVehicle,
72 RaceType,
73 TotalCP,
74 Float: RaceVehCoords[2][4],
75 Float: CPCoords[MAX_CP_POR_CARRERA][4],
76 Index,
77 PlayersCount[2],
78 Timer:CountTimer,
79 CountAmountRace,
80 RaceTick,
81 RaceStarted,
82 Position,
83 FinishCount,
84 JoinCount,
85 Timer:rCounter,
86 RaceTime,
87 TotalRaces,
88 TimeProgress
89;
90new stock g_arrVehicleNames[][] =
91{
92 "Landstalker", "Bravura", "Buffalo", "Linerunner", "Perrenial", "Sentinel", "Dumper", "Firetruck", "Trashmaster",
93 "Stretch", "Manana", "Infernus", "Voodoo", "Pony", "Mule", "Cheetah", "Ambulance", "Leviathan", "Moonbeam",
94 "Esperanto", "Taxi", "Washington", "Bobcat", "Whoopee", "BF Injection", "Hunter", "Premier", "Enforcer",
95 "Securicar", "Banshee", "Predator", "Bus", "Rhino", "Barracks", "Hotknife", "Trailer", "Previon", "Coach",
96 "Cabbie", "Stallion", "Rumpo", "RC Bandit", "Romero", "Packer", "Monster", "Admiral", "Squalo", "Seasparrow",
97 "Pizzaboy", "Tram", "Trailer", "Turismo", "Speeder", "Reefer", "Tropic", "Flatbed", "Yankee", "Caddy", "Solair",
98 "Berkley's RC Van", "Skimmer", "PCJ-600", "Faggio", "Freeway", "RC Baron", "RC Raider", "Glendale", "Oceanic",
99 "Sanchez", "Sparrow", "Patriot", "Quad", "Coastguard", "Dinghy", "Hermes", "Sabre", "Rustler", "ZR-350", "Walton",
100 "Regina", "Comet", "BMX", "Burrito", "Camper", "Marquis", "Baggage", "Dozer", "Maverick", "News Chopper", "Rancher",
101 "FBI Rancher", "Virgo", "Greenwood", "Jetmax", "Hotring", "Sandking", "Blista Compact", "Police Maverick",
102 "Boxville", "Benson", "Mesa", "RC Goblin", "Hotring Racer A", "Hotring Racer B", "Bloodring Banger", "Rancher",
103 "Super GT", "Elegant", "Journey", "Bike", "Mountain Bike", "Beagle", "Cropduster", "Stunt Plane", "Tanker", "Roadtrain",
104 "Nebula", "Majestic", "Buccaneer", "Shamal", "Hydra", "FCR-900", "NRG-500", "HPV1000", "Cement Truck", "Tow Truck",
105 "Fortune", "Cadrona", "SWAT Truck", "Willard", "Forklift", "Tractor", "Combine", "Feltzer", "Remington", "Slamvan",
106 "Blade", "Streak", "Freight", "Vortex", "Vincent", "Bullet", "Clover", "Sadler", "Firetruck", "Hustler", "Intruder",
107 "Primo", "Cargobob", "Tampa", "Sunrise", "Merit", "Utility", "Nevada", "Yosemite", "Windsor", "Monster", "Monster",
108 "Uranus", "Jester", "Sultan", "Stratum", "Elegy", "Raindance", "RC Tiger", "Flash", "Tahoma", "Savanna", "Bandito",
109 "Freight Flat", "Streak Carriage", "Kart", "Mower", "Dune", "Sweeper", "Broadway", "Tornado", "AT-400", "DFT-30",
110 "Huntley", "Stafford", "BF-400", "News Van", "Tug", "Trailer", "Emperor", "Wayfarer", "Euros", "Hotdog", "Club",
111 "Freight Box", "Trailer", "Andromada", "Dodo", "RC Cam", "Launch", "LSPD Car", "SFPD Car", "LVPD Car",
112 "Police Rancher", "Picador", "S.W.A.T", "Alpha", "Phoenix", "Glendale", "Sadler", "Luggage", "Luggage", "Stairs",
113 "Boxville", "Tiller", "Utility Trailer", "Jetpack"
114};
115
116new bool:SRaces;
117static DB:ZLDB;
118// ---- TextDraws ----
119new Text:AnuncioEvento = Text:INVALID_TEXT_DRAW;
120new Text:EmpezarCarrera = Text:INVALID_TEXT_DRAW;
121
122new PlayerText:RaceInfoText = PlayerText:INVALID_TEXT_DRAW;
123
124// ---- CallBacks ----
125public OnFilterScriptInit()
126{
127 TextosDePantalla();
128 SRaces = true;
129
130 ZLDB = db_open(sql_database);
131 new DB:bd = db_open(sql_database);
132
133 if (bd)
134 {
135 db_free_result(db_query(bd
136 , "CREATE TABLE IF NOT EXISTS CARRERA (ID_CARRERA INTEGER NOT \
137 NULL PRIMARY KEY, NOMBRE TEXT NOT NULL, MODELO_VEHICULO INTEGER \
138 NOT NULL, TIPO_CARRERA INTEGER NOT NULL)"));
139
140 db_free_result(db_query(bd
141 , "CREATE TABLE IF NOT EXISTS TIEMPO_CARRERA (ID_CARRERA INTEGER \
142 NOT NULL REFERENCES CARRERA(ID_CARRERA), NUMERO_POSICION INTEGER \
143 NOT NULL, TIEMPO INTEGER NOT NULL, NOMBRE_CORREDOR INTEGER NOT NULL, \
144 PRIMARY KEY (ID_CARRERA, NUMERO_POSICION))"));
145
146 db_free_result(db_query(bd
147 , "CREATE TABLE IF NOT EXISTS POSICION_PARTIDA_CARRERA (ID_CARRERA \
148 INTEGER NOT NULL REFERENCES CARRERA(ID_CARRERA), NUMERO_POSICION \
149 INTEGER NOT NULL, COORDENADA_X REAL NOT NULL, COORDENADA_Y REAL \
150 NOT NULL, COORDENADA_Z REAL NOT NULL, ROTACION REAL NOT NULL, \
151 PRIMARY KEY (ID_CARRERA, NUMERO_POSICION))"));
152
153 db_free_result(db_query(bd
154 , "CREATE TABLE IF NOT EXISTS PUNTO_CONTROL_CARRERA (ID_CARRERA \
155 INTEGER NOT NULL REFERENCES CARRERA(ID_CARRERA), ID_PUNTO_CONTROL INTEGER \
156 NOT NULL, COORDENADA_X REAL NOT NULL, COORDENADA_Y REAL NOT NULL, \
157 COORDENADA_Z REAL NOT NULL, PRIMARY KEY (ID_CARRERA, \
158 ID_PUNTO_CONTROL))"));
159
160 db_close(bd);
161 }
162 return 1;
163}
164
165public OnFilterScriptExit()
166{
167 TextDrawHideForAll(AnuncioEvento);
168 foreach(new i : Player)
169 {
170 DisablePlayerRaceCheckpoint(i);
171 Usuario[i][EsCorredor] = false;
172 DisableRemoteVehicleCollisions(i,0);
173 stop Usuario[i][InfoTimer];
174 }
175 JoinCount = 0;
176 FinishCount = 0;
177 TimeProgress = 0;
178 db_close(ZLDB);
179 return 1;
180}
181
182public OnPlayerConnect(playerid)
183{
184 TextosDePantallaPlayer(playerid);
185 return 1;
186}
187
188public OnPlayerDisconnect(playerid, reason)
189{
190 new Razon[3][] = {"Crash","Salio","Expulsado"};
191
192 PlayerTextDrawDestroy(playerid, RaceInfoText);
193 if(Usuario[playerid][EsCorredor] == true)
194 {
195 JoinCount--;
196 Usuario[playerid][EsCorredor] = false;
197 SetVehicleHealth(GetPlayerVehicleID(playerid),1250.0);
198 DisableRemoteVehicleCollisions(playerid,0);
199 DisablePlayerRaceCheckpoint(playerid);
200 PlayerTextDrawHide(playerid, RaceInfoText);
201 Usuario[playerid][CPProgess] = 0;
202 stop Usuario[playerid][InfoTimer];
203 SendClientMessageToAllEx(COLOR_AMARILLO, "« Info » "COL_BLANCO"El jugador %s ha salido de la carrera (razón: %s)",pName(playerid),Razon[reason]);
204 }
205 if(BuildRace == playerid+1)
206 {
207 BuildRace = 0;
208 BuildCheckPointCount = 0;
209 BuildVehPosCount = 0;
210 BuildTakeCheckpoints = false;
211 BuildTakeVehPos = false;
212 BorrarCarrera(BuildName);
213 }
214 return 1;
215}
216
217public OnPlayerDeath(playerid, killerid, reason)
218{
219 if(BuildRace == playerid+1)
220 {
221 BuildRace = 0;
222 BuildCheckPointCount = 0;
223 BuildVehPosCount = 0;
224 BuildTakeCheckpoints = false;
225 BuildTakeVehPos = false;
226 BorrarCarrera(BuildName);
227 }
228 return 1;
229}
230
231public OnPlayerSpawn(playerid)
232{
233 if(Usuario[playerid][EsCorredor] == true)
234 {
235 if(IsPlayerInAnyVehicle(playerid) && GetPlayerState(playerid) == PLAYER_STATE_DRIVER)
236 {
237 SetVehiclePos(GetPlayerVehicleID(playerid),CPCoords[Usuario[playerid][CPProgess]-1][0],CPCoords[Usuario[playerid][CPProgess]-1][1],CPCoords[Usuario[playerid][CPProgess]-1][2]);
238 SetCameraBehindPlayer(playerid);
239 }
240 else
241 {
242 SetPlayerPos(playerid,CPCoords[Usuario[playerid][CPProgess]-1][0],CPCoords[Usuario[playerid][CPProgess]-1][1],CPCoords[Usuario[playerid][CPProgess]-1][2]);
243 SetCameraBehindPlayer(playerid);
244 defer DarAuto[1000](playerid);
245 }
246 SendClientMessage(playerid,COLOR_AZUL,"• "COL_BLANCO"Has sido teletransportado automáticamente al último punto de control que tocaste.");
247 SendClientMessage(playerid,COLOR_AZUL,"• "COL_BLANCO"Si quieres salir de la carrera, tipea {33CCFF}/salir");
248 }
249 return 1;
250}
251
252public OnPlayerCommandReceived(playerid, cmdtext[])
253{
254 if(Usuario[playerid][EsCorredor] == true && strfind(cmdtext,"salir",true) == -1 && strfind(cmdtext,"citem",true) == -1)
255 {
256 SendClientMessage(playerid,COLOR_ROJO, "« Error » "COL_BLANCO"No puedes usar comandos estando en la carrera, usa /salir para salir.");
257 return 0;
258 }
259 return 1;
260}
261
262public OnPlayerEnterRaceCheckpoint(playerid)
263{
264 if(Usuario[playerid][CPProgess] == TotalCP -1)
265 {
266 new TimeStamp,TotalRaceTime,rTime[3],Prize[2],tiempo[35];
267 Position++;
268 TimeStamp = GetTickCount();
269 TotalRaceTime = TimeStamp - RaceTick;
270 ConvertTime(var, TotalRaceTime, rTime[0], rTime[1], rTime[2]);
271 if(rTime[0] >= 2 && rTime[1] >= 1){format(tiempo, 30, "%d minutos con %d segundos",rTime[0], rTime[1]);}
272 else if(rTime[0] == 1 && rTime[1] >= 1){format((tiempo), 27, "1 minuto con %d segundos", rTime[1]);}
273 else if(rTime[0] < 1 && rTime[1] >= 1){format((tiempo), 12, "%d segundos",rTime[1]);}
274
275 switch(Position)
276 {
277 case 1: Prize[0] = 150, Prize[1] = 10000;
278 case 2: Prize[0] = 100, Prize[1] = 9000;
279 case 3: Prize[0] = 80, Prize[1] = 8000;
280 case 4: Prize[0] = 50, Prize[1] = 7000;
281 case 5: Prize[0] = 50, Prize[1] = 6000;
282 case 6: Prize[0] = 30, Prize[1] = 5000;
283 case 7: Prize[0] = 30, Prize[1] = 4000;
284 case 8: Prize[0] = 30, Prize[1] = 3000;
285 case 9: Prize[0] = 20, Prize[1] = 2000;
286 default: Prize[0] = 10, Prize[1] = 1000;
287 }
288 if(Position == 1)
289 {
290 SendClientMessageToAllEx(COLOR_AZUL, "« carrera » %s(ID:%d) ha ganado la carrera '%s' en %s (Premio: +%d Score y +$%d)", pName(playerid), playerid, RaceName, tiempo, Prize[0], Prize[1]);
291 SendClientMessageToAll(-1, ""COL_VERDE"• "COL_BLANCO"Bono 1er lugar: "COL_VERDE"5 Rockets");
292 GivePlayerMoney(playerid, Prize[1]);
293 new score = GetPlayerScore(playerid); SetPlayerScore(playerid, score+Prize[0]);
294 GivePlayerWeapon(playerid, WEAPON_ROCKETLAUNCHER, 5);
295// Usuario[playerid][ScoreCarrera] = Usuario[playerid][ScoreCarrera]+ 1;
296 GuardarScoreRace(playerid);
297 GuardarScoreFreeRoam(playerid);
298 }
299 else if(Position >= 2)
300 {
301 SendClientMessageToAllEx(COLOR_AZUL, "« carrera » %s(ID:%d) ha finalizado la carrera '%s' [Posición #%d - Tiempo: %s]", pName(playerid), playerid, RaceName, Position, tiempo);
302 SendClientMessageToAllEx(-1, ""COL_VERDE"• "COL_BLANCO"Premio #%d lugar: "COL_VERDE"+%d Score y +$%d",Position, Prize[0], Prize[1]);
303
304 GivePlayerMoney(playerid, Prize[1]);
305 new score = GetPlayerScore(playerid); SetPlayerScore(playerid, score+Prize[0]);
306 }
307 if(FinishCount <= 5)
308 {
309 if (EsTiempoRecord(RaceName, TimeProgress+1, TotalRaceTime))
310 {
311 if (!HayTiemposRegistrados(RaceName, TimeProgress+1))
312 {
313 if(TimeProgress+1 <= 3)
314 {
315 SendClientMessageToAllEx(COLOR_AZUL, "« record » %s ha hecho un nuevo record en la carrera '%s' y recibe un bono de $1000.000", pName(playerid), RaceName);
316 AlmacenarTiempoCarrera(RaceName, TimeProgress+1, TotalRaceTime, Usuario[playerid][pID]);
317 GivePlayerMoney(playerid, 1000000);
318 }
319 }
320 else
321 {
322 new nombreCorredorRecordPrevio, tiempoRecordPrevio;
323 ObtenerRecordPrevio(RaceName, TimeProgress+1, TotalRaceTime, nombreCorredorRecordPrevio, tiempoRecordPrevio);
324 new Dueno[24];
325 Dueno = "Testing Dialog";
326/*
327 new Query[120], Dueno[MAX_PLAYER_NAME], DBResult:Result;
328 format(Query, sizeof(Query), "SELECT `NICK` FROM `USERS` WHERE `ID` = '%d' COLLATE NOCASE", nombreCorredorRecordPrevio);
329 Result = db_query(ZLDB, Query);
330 if(db_num_rows(Result)) db_get_field_assoc(Result, "NICK",Dueno, 25);
331 db_free_result(Result);
332*/
333 if(Usuario[playerid][pID] == nombreCorredorRecordPrevio)
334 {
335 SendClientMessageToAllEx(COLOR_AZUL, "« record » %s ha superado su propio record en la carrera '%s' y recibe un bono de $500000", pName(playerid), RaceName);
336 GivePlayerMoney(playerid, 500000);
337 }
338 else
339 {
340 SendClientMessageToAllEx(COLOR_AZUL, "« record » %s ha superado el record de %s en la carrera '%s' y recibe un bono de $250000", pName(playerid), Dueno, RaceName);
341 GivePlayerMoney(playerid, 250000);
342 }
343 ActualizarTiempoCarrera(RaceName, TimeProgress+1, TotalRaceTime, Usuario[playerid][pID]);
344 }
345 }
346 TimeProgress++;
347 }
348 FinishCount++;
349 DisablePlayerRaceCheckpoint(playerid);
350 Usuario[playerid][CPProgess]++;
351 Usuario[playerid][EsCorredor] = false;
352 SetVehicleHealth(GetPlayerVehicleID(playerid),1250.0);
353 DisableRemoteVehicleCollisions(playerid,0);
354 PlayerTextDrawHide(playerid, RaceInfoText);
355 stop Usuario[playerid][InfoTimer];
356 SetCameraBehindPlayer(playerid);
357 SetPlayerVirtualWorld(playerid, 0);
358 if(FinishCount >= JoinCount) return DetenerCarrera();
359 }
360 else
361 {
362 Usuario[playerid][CPProgess]++;
363 CPCoords[Usuario[playerid][CPProgess]][3]++;
364 Usuario[playerid][PosicionCarrera] = floatround(CPCoords[Usuario[playerid][CPProgess]][3], floatround_floor);
365 SetCP(playerid, Usuario[playerid][CPProgess], Usuario[playerid][CPProgess]+1, TotalCP, RaceType);
366 PlayerPlaySound(playerid, 1137, 0.0, 0.0, 0.0);
367 }
368 return 1;
369}
370
371public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
372{
373 if(Usuario[playerid][EsCorredor] == true)
374 {
375 if(newkeys & KEY_CROUCH)
376 {
377 if(IsPlayerInAnyVehicle(playerid) && GetPlayerState(playerid) == PLAYER_STATE_DRIVER)
378 {
379 SetVehiclePos(GetPlayerVehicleID(playerid),CPCoords[Usuario[playerid][CPProgess]-1][0],CPCoords[Usuario[playerid][CPProgess]-1][1],CPCoords[Usuario[playerid][CPProgess]-1][2]);
380 SetCameraBehindPlayer(playerid);
381 }
382 else
383 {
384 SetPlayerPos(playerid,CPCoords[Usuario[playerid][CPProgess]-1][0],CPCoords[Usuario[playerid][CPProgess]-1][1],CPCoords[Usuario[playerid][CPProgess]-1][2]);
385 SetCameraBehindPlayer(playerid);
386 defer DarAuto[1000](playerid);
387 }
388 SendClientMessage(playerid,COLOR_AZUL,"• "COL_BLANCO"Has sido teletransportado automáticamente al último punto de control que tocaste.");
389 }
390 }
391 if(newkeys & KEY_FIRE)
392 {
393 if(BuildRace == playerid+1)
394 {
395 new Float: vPos[4];
396 if(BuildTakeVehPos == true)
397 {
398 if(!IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, COLOR_ROJO, "« Error » "COL_BLANCO"Necesitas estar en un vehÃculo.");
399 GetVehiclePos(GetPlayerVehicleID(playerid), vPos[0], vPos[1], vPos[2]);
400 GetVehicleZAngle(GetPlayerVehicleID(playerid), vPos[3]);
401 AgregarPosicionPartida(BuildName, BuildVehPosCount, vPos[0], vPos[1], vPos[2], vPos[3]);
402 SendClientMessageEx(playerid, COLOR_AMARILLO, "« Info » "COL_BLANCO"La posición del vehÃculo #%d ha sido colocada.", BuildVehPosCount+1);
403 BuildVehPosCount++;
404 }
405 if(BuildVehPosCount >= 2)
406 {
407 BuildVehPosCount = 0;
408 BuildTakeVehPos = false;
409 MostrarDialogo(playerid, 605);
410 }
411 if(BuildTakeCheckpoints == true)
412 {
413 if(BuildCheckPointCount > MAX_CP_POR_CARRERA) return SendClientMessage(playerid, COLOR_ROJO, "« Error » "COL_BLANCO"Has alcanzado la cantidad máxima de checkpoints.");
414 if(!IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, COLOR_ROJO, "« Error » "COL_BLANCO"Necesitas estar en un vehÃculo.");
415 GetVehiclePos(GetPlayerVehicleID(playerid), vPos[0], vPos[1], vPos[2]);
416 AgregarPuntoControl(BuildName, BuildCheckPointCount, vPos[0], vPos[1], vPos[2]);
417 SendClientMessageEx(playerid, COLOR_AMARILLO, "« Info » "COL_BLANCO"El checkpoint #%d ha sido colocado.", BuildCheckPointCount+1);
418 BuildCheckPointCount++;
419 }
420 }
421 }
422 if(newkeys & KEY_SECONDARY_ATTACK)
423 {
424 if(BuildRace == playerid+1)
425 {
426 if(BuildTakeCheckpoints == true)
427 {
428 MostrarDialogo(playerid, 606);
429 TotalRaces = ContarCarrerasAlmacenadas();
430 TotalRaces++;
431 }
432 }
433 }
434 return 1;
435}
436
437public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
438{
439 switch(dialogid)
440 {
441 case DIALOGO_SERVER_DATOS:
442 {
443 if(response)
444 {
445 switch(listitem)
446 {
447 case 0:
448 {
449 if(SRaces == false)
450 {
451 SRaces = true;
452 SendClientMessageToAllEx(COLOR_AMARILLO, "« Info » "COL_BLANCO"El administrador %s(ID:%d) ha activado las carreras.", pName(playerid),playerid);
453 CallRemoteFunction("OnPlayerCommandText", "is", playerid, "/cpanel");
454 }
455 else
456 {
457 SRaces = false;
458 SendClientMessageToAllEx(COLOR_AMARILLO, "« Info » "COL_BLANCO"El administrador %s(ID:%d) ha desactivado las carreras.", pName(playerid),playerid);
459 CallRemoteFunction("OnPlayerCommandText", "is", playerid, "/cpanel");
460 }
461 foreach(new i : Player) PlayerPlaySound(i,1057,0.0,0.0,0.0);
462 }
463 case 1: cmd_detenercarrera(playerid);
464 case 2: cmd_iniciarcarrera(playerid);
465 case 3: cmd_crearcarrera(playerid);
466 }
467 }
468 }
469 case DIALOGO_MAS_CARRERAS:
470 {
471 if(!response)
472 {
473 Usuario[playerid][Consulta] = Usuario[playerid][Consulta]+20;
474 CallRemoteFunction("OnPlayerCommandText", "is", playerid, "/iniciarcarrera");
475 }
476 if(response)
477 {
478 Usuario[playerid][Consulta] = 0;
479 if(SRaces == false) return SendClientMessage(playerid, COLOR_ROJO, "« Error » "COL_BLANCO"Las carreras fueron desactivadas por un administrador.");
480 if(BuildRace != 0) return SendClientMessage(playerid, COLOR_ROJO, "« Error » "COL_BLANCO"Alguien está construyendo una carrera.");
481 if(RaceBusy == 0x01 || RaceStarted > 0) return SendClientMessage(playerid, COLOR_ROJO, "« Error » "COL_BLANCO"Hay una carrera en curso, espera a que termine.");
482 if(GetPlayerVirtualWorld(playerid) != 0) return SendClientMessage(playerid,COLOR_ROJO,"« Error » "COL_BLANCO"Debes estar en el mundo virtual 0.");
483 LoadRace(playerid, listitem+1);
484 }
485 }
486 case 599:
487 {
488 if(!response) return BuildRace = 0;
489 switch(listitem)
490 {
491 case 0: BuildRaceType = 0;
492 case 1: BuildRaceType = 3;
493 }
494 MostrarDialogo(playerid, 600);
495 }
496 case 600..601:
497 {
498 if(!response) return MostrarDialogo(playerid, 599);
499 if(!strlen(inputtext)) return MostrarDialogo(playerid, 601);
500 if(strlen(inputtext) < 5 || strlen(inputtext) > 19) return MostrarDialogo(playerid, 601);
501
502 new string[138], DBResult:qresult;
503 format(string, sizeof(string), "SELECT `NOMBRE` FROM `CARRERA` WHERE `NOMBRE` = '%s'",inputtext);
504 qresult = db_query(ZLDB, string);
505
506 if(db_num_rows(qresult))
507 {
508 db_free_result(qresult);
509 SendClientMessage(playerid,COLOR_ROJO,"« Error » "COL_BLANCO"Esta carrera ya existe.");
510 return MostrarDialogo(playerid, 600);
511 }
512
513 strmid(BuildName, inputtext, 0, strlen(inputtext), sizeof(BuildName));
514 MostrarDialogo(playerid, 602);
515 }
516 case 602..603:
517 {
518 if(!response) return MostrarDialogo(playerid, 600);
519 if(!strlen(inputtext)) return MostrarDialogo(playerid, 603);
520 if(EsNumerico(inputtext))
521 {
522 if(!IsValidVehicle(strval(inputtext))) return MostrarDialogo(playerid, 603);
523 new Float: pPos[4];
524 GetPlayerPos(playerid, pPos[0], pPos[1], pPos[2]);
525 GetPlayerFacingAngle(playerid, pPos[3]);
526 BuildModeVID = strval(inputtext);
527 CrearVehiculo(playerid,strval(inputtext));
528 MostrarDialogo(playerid, 604);
529 }
530 else
531 {
532 if(!IsValidVehicle(ReturnVehicleID(inputtext))) return MostrarDialogo(playerid, 603);
533 new Float: pPos[4];
534 GetPlayerPos(playerid, pPos[0], pPos[1], pPos[2]);
535 GetPlayerFacingAngle(playerid, pPos[3]);
536 BuildModeVID = ReturnVehicleID(inputtext);
537 CrearVehiculo(playerid,ReturnVehicleID(inputtext));
538 MostrarDialogo(playerid, 604);
539 }
540 }
541 case 604:
542 {
543 if(!response) return MostrarDialogo(playerid, 602);
544 AgregarCarrera(BuildName, BuildModeVID, BuildRaceType);
545 SendClientMessage(playerid, COLOR_AMARILLO, "« Info » "COL_BLANCO"Ve a la lÃnea de inicio y presiona ~k~~VEHICLE_FIREWEAPON~ para poner la posición #1, has lo mismo con la posición #2");
546 SendClientMessage(playerid, COLOR_AMARILLO, "« Info » "COL_BLANCO"Luego de esto verás un diálogo para continuar.");
547 BuildVehPosCount = 0;
548 BuildTakeVehPos = true;
549 }
550 case 605:
551 {
552 if(!response) return MostrarDialogo(playerid, 604);
553 SendClientMessage(playerid, COLOR_AMARILLO, "« Info » "COL_BLANCO"Es hora de poner los puntos de control (Checkpoint's), pulsa ~k~~VEHICLE_FIREWEAPON~ para ello.");
554 SendClientMessage(playerid, COLOR_AMARILLO, "« Info » "COL_BLANCO"Cuando termines de colocarlos presiona ~k~~VEHICLE_ENTER_EXIT~, si no reacciona, presionalo nuevamente.");
555 BuildCheckPointCount = 0;
556 BuildTakeCheckpoints = true;
557 }
558 case 606:
559 {
560 if(!response) return MostrarDialogo(playerid, 606);
561 BuildRace = 0;
562 BuildModeVID = -1;
563 BuildCheckPointCount = 0;
564 BuildVehPosCount = 0;
565 BuildTakeCheckpoints = false;
566 BuildTakeVehPos = false;
567 }
568
569 }
570 return 1;
571}
572
573// ---- Comandos ----
574CMD:cpanel(playerid,params[])
575{
576 if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid,COLOR_ROJO,"« Error » "COL_BLANCO"Solo el dueño puede usar este comando.");
577 new str[1000], crear[30], detener[40], iniciar[30], permitir[30];
578 crear = BuildRace == 0 ? (""COL_VERDE"Puede crearse") : (""COL_ROJO"No puede crearse"); detener = RaceBusy == 0x00 ? (""COL_ROJO"No hay carreras activas") : (""COL_VERDE"Detener");
579 iniciar = RaceBusy == 0x00 ? (""COL_VERDE"Iniciar") : (""COL_ROJO"Ya hay una carrera activa"); permitir = SRaces == false ? (""COL_ROJO"Desactivado") : (""COL_VERDE"Activado");
580
581 format(str, sizeof(str), "Nombre\tEstado\
582 \n» Permitir carrera\t%s\
583 \n» Detener Carrera\t%s\
584 \n» Iniciar una Carrera\t%s\
585 \n» Crear una Carrera\t%s",permitir, detener, iniciar, crear);
586 ShowPlayerDialog(playerid,DIALOGO_SERVER_DATOS,DIALOG_STYLE_TABLIST_HEADERS, "¤ Panel del carreras ¤", str, "Seleccionar","Cerrar");
587 PlayerPlaySound(playerid,1139,0.0,0.0,0.0);
588 return 1;
589}
590
591CMD:crearcarrera(playerid)
592{
593 if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid,COLOR_ROJO,"« Error » "COL_BLANCO"Solo el dueño puede usar este comando.");
594 if(BuildRace != 0) return SendClientMessage(playerid, COLOR_ROJO, "« Error » "COL_BLANCO"Alguien está construyendo una carrera.");
595 if(RaceBusy == 0x01) return SendClientMessage(playerid, COLOR_ROJO, "« Error » "COL_BLANCO"Espere primero hasta que termine la carrera.");
596 if(IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid,COLOR_ROJO,"« Error » "COL_BLANCO"Primero debes salir de tu vehÃculo.");
597 BuildRace = playerid+1;
598 MostrarDialogo(playerid, 599);
599 return 1;
600}
601
602CMD:detenercarrera(playerid)
603{
604 if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid,COLOR_ROJO,"« Error » "COL_BLANCO"Solo el dueño puede usar este comando.");
605 if(RaceBusy == 0x00 || RaceStarted == 0) return SendClientMessage(playerid, COLOR_ROJO, "« Error » "COL_BLANCO"No hay carrera en curso.");
606 SendClientMessageToAllEx(COLOR_AMARILLO, "« Info » "COL_BLANCO"El administrador %s(ID:%d) detuvo la carrera %s.", pName(playerid),playerid,RaceName);
607 DetenerCarrera();
608 return 1;
609}
610
611CMD:iniciarcarrera(playerid)
612{
613 if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid,COLOR_ROJO,"« Error » "COL_BLANCO"Solo el dueño puede usar este comando.");
614 if(SRaces == false) return SendClientMessage(playerid, COLOR_ROJO, "« Error » "COL_BLANCO"Las carreras fueron desactivadas por un administrador.");
615 if(BuildRace != 0) return SendClientMessage(playerid, COLOR_ROJO, "« Error » "COL_BLANCO"Alguien está construyendo una carrera.");
616 if(RaceBusy == 0x01 || RaceStarted > 0) return SendClientMessage(playerid, COLOR_ROJO, "« Error » "COL_BLANCO"Hay una carrera en curso, espera a que termine.");
617
618 new string[138], DBResult:qresult;
619 format(string, sizeof(string), "SELECT `NOMBRE`,`MODELO_VEHICULO`,`TIPO_CARRERA` FROM `CARRERA` ORDER BY (`ID_CARRERA` * 1) ASC limit 20 OFFSET %d",Usuario[playerid][Consulta]);
620 qresult = db_query(ZLDB, string);
621
622 if(!db_num_rows(qresult))
623 {
624 Usuario[playerid][Consulta] = 0;
625 db_free_result(qresult);
626 SendClientMessage(playerid,COLOR_ROJO,"« Error » "COL_BLANCO"No existen más carreras.");
627 return 1;
628 }
629 new final_string[1600], Nombre[50], RaceIDV, RaceTipo, PNombre[11];
630 strcat(final_string, "Nombre\tVehÃculo\tTipo de carrera\n");
631 do
632 {
633 db_get_field_assoc(qresult, "NOMBRE", Nombre, 50);
634 RaceIDV = db_get_field_assoc_int(qresult, "MODELO_VEHICULO");
635 RaceTipo = db_get_field_assoc_int(qresult, "TIPO_CARRERA");
636 PNombre = RaceTipo == 0 ? ("Terrestre") : ("Aérea");
637
638 format(final_string,sizeof(final_string),"%s\n%s\t%s\t%s\n",final_string, Nombre, GetVehicleName(RaceIDV), PNombre);
639 }
640 while(db_next_row(qresult));
641 ShowPlayerDialog(playerid,DIALOGO_MAS_CARRERAS, DIALOG_STYLE_TABLIST_HEADERS, "¤ Lista de Carreras ¤", final_string, "Seleccionar", "+ Carreras");
642 return 1;
643}
644
645CMD:unirme(playerid, params[])
646{
647 if(RaceStarted > 0) return SendClientMessage(playerid,COLOR_ROJO, "« Error » "COL_BLANCO"Ya ha empezado la carrera, espera a que termine y empieze otro.");
648 if(RaceBusy == 0x00) return SendClientMessage(playerid,COLOR_ROJO, "« Error » "COL_BLANCO"No hay ninguna carrera actualmente.");
649 if(Usuario[playerid][EsCorredor] == true) return SendClientMessage(playerid, COLOR_ROJO, "« Error » "COL_BLANCO"Ya estás en la carrera.");
650 if(IsPlayerInAnyVehicle(playerid)) return defer SetupRaceForPlayerTimer[2500](playerid), RemovePlayerFromVehicle(playerid), Usuario[playerid][EsCorredor] = true;
651 SetupRaceForPlayer(playerid);
652 Usuario[playerid][EsCorredor] = true;
653 return 1;
654}
655
656CMD:salir(playerid, params[])
657{
658 if(Usuario[playerid][EsCorredor] == false) return SendClientMessage(playerid, COLOR_ROJO, "« Error » "COL_BLANCO"No estás en la carrera.");
659 if(RaceStarted != 2) return SendClientMessage(playerid,COLOR_ROJO, "« Error » "COL_BLANCO"Aún no ha empezado la carrera, espera a que comienze.");
660 JoinCount--;
661 Usuario[playerid][EsCorredor] = false;
662 SetVehicleHealth(GetPlayerVehicleID(playerid),1250.0);
663 DisableRemoteVehicleCollisions(playerid,0);
664 DisablePlayerRaceCheckpoint(playerid);
665 PlayerTextDrawHide(playerid, RaceInfoText);
666 Usuario[playerid][CPProgess] = 0;
667 stop Usuario[playerid][InfoTimer];
668 TogglePlayerControllable(playerid, true);
669 SetCameraBehindPlayer(playerid);
670 SetPlayerVirtualWorld(playerid, 0);
671 SendClientMessageToAllEx(COLOR_AMARILLO, "« Info » "COL_BLANCO"El jugador %s ha salido de la carrera (razón: Quiso salirse)",pName(playerid));
672 return 1;
673}
674
675// ---- Funciones, Stocks y timers ----
676TextosDePantalla()
677{
678 EmpezarCarrera = TextDrawCreate(320.800018, 389.759979, "_");
679 TextDrawLetterSize(EmpezarCarrera, 0.213996, 1.726933);
680 TextDrawTextSize(EmpezarCarrera, 667.024597, 336.746276);
681 TextDrawAlignment(EmpezarCarrera, 2);
682 TextDrawColor(EmpezarCarrera, -1);
683 TextDrawUseBox(EmpezarCarrera, true);
684 TextDrawBoxColor(EmpezarCarrera, 1027423573);
685 TextDrawSetShadow(EmpezarCarrera, 0);
686 TextDrawSetOutline(EmpezarCarrera, 1);
687 TextDrawBackgroundColor(EmpezarCarrera, 51);
688 TextDrawFont(EmpezarCarrera, 2);
689 TextDrawSetProportional(EmpezarCarrera, 1);
690 return 1;
691}
692
693TextosDePantallaPlayer(playerid)
694{
695 RaceInfoText = CreatePlayerTextDraw(playerid, 320.800018, 389.759979, "_");
696 PlayerTextDrawLetterSize(playerid, RaceInfoText, 0.213994, 1.726933);
697 PlayerTextDrawTextSize(playerid, RaceInfoText, 878.225036, 383.786315);
698 PlayerTextDrawAlignment(playerid, RaceInfoText, 2);
699 PlayerTextDrawColor(playerid, RaceInfoText, -1);
700 PlayerTextDrawUseBox(playerid, RaceInfoText, true);
701 PlayerTextDrawBoxColor(playerid, RaceInfoText, 1027423573);
702 PlayerTextDrawSetShadow(playerid, RaceInfoText, 0);
703 PlayerTextDrawSetOutline(playerid, RaceInfoText, 1);
704 PlayerTextDrawBackgroundColor(playerid, RaceInfoText, 51);
705 PlayerTextDrawFont(playerid, RaceInfoText, 2);
706 PlayerTextDrawSetProportional(playerid, RaceInfoText, 1);
707 return 1;
708}
709
710GuardarScoreFreeRoam(playerid)
711{
712 printf("[DEBUG] ScoreFreeroam de %s guardado",pName(playerid));
713/* static Query[100];
714 format(Query,sizeof(Query),"UPDATE `USERS` SET SCOREFREEROAM = '%d' WHERE `ID` = '%d' COLLATE NOCASE",GetPlayerScore(playerid),Usuario[playerid][pID]);
715 db_query(ZLDB, Query);*/
716 return 1;
717}
718
719GuardarScoreRace(playerid)
720{
721 printf("[DEBUG] ScoreRace de %s guardado",pName(playerid));
722/* static Query[100];
723 format(Query,sizeof(Query),"UPDATE `USERS` SET SCORERACE = '%d' WHERE `ID` = '%d' COLLATE NOCASE",Usuario[playerid][ScoreCarrera],Usuario[playerid][pID]);
724 db_query(ZLDB, Query);*/
725 return 1;
726}
727
728CrearVehiculo(playerid,model)
729{
730 if(IsPlayerInAnyVehicle(playerid)) RemovePlayerFromVehicle(playerid);
731
732 new Float:Pos[4];
733 GetPlayerPos(playerid,Pos[0],Pos[1],Pos[2]);
734 GetPlayerFacingAngle(playerid,Pos[3]);
735 if(Usuario[playerid][Vehiculo] != -1) DestruirVehiculo(playerid,Usuario[playerid][Vehiculo]);
736 new vehicleid = AddStaticVehicleEx(model,Pos[0],Pos[1],Pos[2],Pos[3],random(255),random(255), -1);
737 SetVehicleVirtualWorld(vehicleid,GetPlayerVirtualWorld(playerid));
738 LinkVehicleToInterior(vehicleid,GetPlayerInterior(playerid));
739 PutPlayerInVehicle(playerid,vehicleid,0);
740 Usuario[playerid][Vehiculo] = vehicleid;
741 SendClientMessageEx(playerid,COLOR_AMARILLO, "« Info » "COL_BLANCO"Has aparecido un "COL_AMARILLO"%s [Modelo: %d]",GetVehicleName(model),model);
742 return vehicleid;
743}
744
745CrearVehiculoEx(playerid, model, Float:x, Float:y, Float:z, Float:angle)
746{
747 if(Usuario[playerid][Vehiculo] != -1) DestruirVehiculo(playerid,Usuario[playerid][Vehiculo]);
748
749 new vehicleid = AddStaticVehicleEx(model,x,y,z,angle,random(255),random(255),(60 * 60));
750 SetPlayerPos(playerid, x,y,z);
751 SetPlayerFacingAngle(playerid, angle);
752 PutPlayerInVehicle(playerid,vehicleid,0);
753 SetPlayerVirtualWorld(playerid, 11);
754 SetVehicleVirtualWorld(vehicleid,11);
755 Usuario[playerid][Vehiculo] = vehicleid;
756 SetPlayerInterior(playerid,0);
757 return vehicleid;
758}
759
760DestruirVehiculo(playerid,vehicleid)
761{
762 if(vehicleid != -1)
763 {
764 new Float:Pos[3];
765 foreach(new i : Player)
766 {
767 if(IsPlayerInVehicle(i, vehicleid))
768 {
769 GetPlayerPos(i,Pos[0],Pos[1],Pos[2]);
770 SetPlayerPos(i,Pos[0],Pos[1]+3,Pos[2]);
771 }
772 }
773 Usuario[playerid][Vehiculo] = -1;
774 DestroyVehicle(vehicleid);
775 }
776 return 1;
777}
778
779TimeConvert(seconds)
780{
781 new tmp[16];
782 new minutes = floatround(seconds/60);
783 seconds -= minutes*60;
784 format(tmp, sizeof(tmp), "%d:%02d", minutes, seconds);
785 return tmp;
786}
787
788stock SendClientMessageEx(playerid, colour, const fmat[], va_args<>)
789{
790 new str[175];
791 va_format(str, sizeof (str), fmat, va_start<3>);
792 return SendClientMessage(playerid, colour, str);
793}
794
795stock SendClientMessageToAllEx(colour, const fmat[], va_args<>)
796{
797 new str[175];
798 va_format(str, sizeof (str), fmat, va_start<2>);
799 return SendClientMessageToAll(colour, str);
800}
801
802stock pName(playerid)
803{
804 new name[24];
805 GetPlayerName(playerid, name, 24);
806 return name;
807}
808
809timer Descongelar[100](playerid)
810{
811 TogglePlayerControllable(playerid,true);
812 return 1;
813}
814
815timer DarAuto[100](playerid)
816{
817 CrearVehiculo(playerid, RaceVehicle);
818 return 1;
819}
820
821CallBack: LoadRace(playerid, IDRace)
822{
823 if(!ExisteCarrera(IDRace)) return SendClientMessage(playerid, COLOR_ROJO, "« Error » "COL_BLANCO"Esta carrera no existe.");
824 static Query[100], By1[35], DBResult: qresult;
825 format(Query, sizeof(Query), "SELECT `NOMBRE` FROM `CARRERA` WHERE `ID_CARRERA` = '%d' COLLATE NOCASE", IDRace);
826 qresult = db_query(ZLDB, Query);
827 if(db_num_rows(qresult))
828 {
829 db_get_field_assoc(qresult, "NOMBRE", By1, sizeof(By1));
830 strmid(RaceName, By1, 0, strlen(By1), sizeof(RaceName));
831 }
832 db_free_result(qresult);
833 CargarDatosCarrera(IDRace, RaceVehicle, RaceType);
834 TotalCP = ContarPuntosControl(IDRace);
835
836 Loop(x, 2)
837 {
838 CargarPosicionCarrera(IDRace, x, RaceVehCoords[x][0], RaceVehCoords[x][1], RaceVehCoords[x][2], RaceVehCoords[x][3]);
839 }
840 Loop(x, TotalCP)
841 {
842 CargarPuntosDeControl(IDRace, x, CPCoords[x][0], CPCoords[x][1], CPCoords[x][2]);
843 }
844 Position = 0;
845 FinishCount = 0;
846 JoinCount = 0;
847 Loop(x, 2) PlayersCount[x] = 0;
848 //Usuario[playerid][EsCorredor] = true;
849 CountAmountRace = CONTEO_INICIA_CARRERA;
850 RaceTime = MAX_TIEMPO_CARRERA;
851 RaceBusy = 0x01;
852 TimeProgress = 0;
853 CountTimer = repeat CountTillRace();
854 SendClientMessageToAllEx(COLOR_AMARILLO,"« Info » "COL_BLANCO"El administrador %s(ID:%d) ha iniciado una carrera.",pName(playerid),playerid);
855 //SetupRaceForPlayer(playerid);
856 return 1;
857}
858
859CallBack: SetCP(playerid, PrevCP, NextCP, MaxCP, Type)
860{
861 if(Type == 0)
862 {
863 if(NextCP == MaxCP) SetPlayerRaceCheckpoint(playerid, 1, CPCoords[PrevCP][0], CPCoords[PrevCP][1], CPCoords[PrevCP][2], CPCoords[NextCP][0], CPCoords[NextCP][1], CPCoords[NextCP][2], CARRERA_CP_TAMAÑO);
864 else SetPlayerRaceCheckpoint(playerid, 0, CPCoords[PrevCP][0], CPCoords[PrevCP][1], CPCoords[PrevCP][2], CPCoords[NextCP][0], CPCoords[NextCP][1], CPCoords[NextCP][2], CARRERA_CP_TAMAÑO);
865 }
866 else if(Type == 3)
867 {
868 if(NextCP == MaxCP) SetPlayerRaceCheckpoint(playerid, 4, CPCoords[PrevCP][0], CPCoords[PrevCP][1], CPCoords[PrevCP][2], CPCoords[NextCP][0], CPCoords[NextCP][1], CPCoords[NextCP][2], CARRERA_CP_TAMAÑO);
869 else SetPlayerRaceCheckpoint(playerid, 3, CPCoords[PrevCP][0], CPCoords[PrevCP][1], CPCoords[PrevCP][2], CPCoords[NextCP][0], CPCoords[NextCP][1], CPCoords[NextCP][2], CARRERA_CP_TAMAÑO);
870 }
871 return 1;
872}
873
874timer SetupRaceForPlayerTimer[100](playerid)
875{
876 SetupRaceForPlayer(playerid);
877 return 1;
878}
879
880CallBack: SetupRaceForPlayer(playerid)
881{
882 SendClientMessageToAllEx(COLOR_AZUL,"« carrera » "COL_BLANCO"%s(ID:%d) ha entrado a la carrera.",pName(playerid),playerid);
883 Usuario[playerid][CPProgess] = 0;
884 TogglePlayerControllable(playerid, false);
885 CPCoords[playerid][3] = 0;
886 SetCP(playerid, Usuario[playerid][CPProgess], Usuario[playerid][CPProgess]+1, TotalCP, RaceType);
887 if(IsOdd(playerid)) Index = 1;
888 else Index = 0;
889
890 switch(Index)
891 {
892 case 0:
893 {
894 if(PlayersCount[0] == 1)
895 {
896 RaceVehCoords[0][0] -= (6 * floatsin(-RaceVehCoords[0][3], degrees));
897 RaceVehCoords[0][1] -= (6 * floatcos(-RaceVehCoords[0][3], degrees));
898 CrearVehiculoEx(playerid, RaceVehicle, RaceVehCoords[0][0], RaceVehCoords[0][1], RaceVehCoords[0][2]+2, RaceVehCoords[0][3]);
899 Camera(playerid, RaceVehCoords[0][0], RaceVehCoords[0][1], RaceVehCoords[0][2], RaceVehCoords[0][3], 20);
900 }
901 }
902 case 1:
903 {
904 if(PlayersCount[1] == 1)
905 {
906 RaceVehCoords[1][0] -= (6 * floatsin(-RaceVehCoords[1][3], degrees));
907 RaceVehCoords[1][1] -= (6 * floatcos(-RaceVehCoords[1][3], degrees));
908 CrearVehiculoEx(playerid, RaceVehicle, RaceVehCoords[1][0], RaceVehCoords[1][1], RaceVehCoords[1][2]+2, RaceVehCoords[1][3]);
909 Camera(playerid, RaceVehCoords[1][0], RaceVehCoords[1][1], RaceVehCoords[1][2], RaceVehCoords[1][3], 20);
910 }
911 }
912 }
913 switch(Index)
914 {
915 case 0:
916 {
917 if(PlayersCount[0] != 1)
918 {
919 CrearVehiculoEx(playerid, RaceVehicle, RaceVehCoords[0][0], RaceVehCoords[0][1], RaceVehCoords[0][2]+2, RaceVehCoords[0][3]);
920 Camera(playerid, RaceVehCoords[0][0], RaceVehCoords[0][1], RaceVehCoords[0][2], RaceVehCoords[0][3], 20);
921 PlayersCount[0] = 1;
922 }
923 }
924 case 1:
925 {
926 if(PlayersCount[1] != 1)
927 {
928 CrearVehiculoEx(playerid, RaceVehicle, RaceVehCoords[1][0], RaceVehCoords[1][1], RaceVehCoords[1][2]+2, RaceVehCoords[1][3]);
929 Camera(playerid, RaceVehCoords[1][0], RaceVehCoords[1][1], RaceVehCoords[1][2], RaceVehCoords[1][3], 20);
930 PlayersCount[1] = 1;
931 }
932 }
933 }
934 Usuario[playerid][InfoTimer] = repeat TextInfo[200](playerid);
935 JoinCount++;
936 return 1;
937}
938
939timer CountTillRace[1000]()
940{
941 new string2[200];
942 format(string2,sizeof(string2),"Faltan ~b~%d ~w~segundos para iniciar la carrera: ~b~%s~n~~w~Para ingresar escribe /unirme, corredores totales: %d",CountAmountRace-5, RaceName, JoinCount);
943 TextDrawSetString(EmpezarCarrera, string2);TextDrawShowForAll(EmpezarCarrera);
944
945 if(CountAmountRace <= 5)
946 {
947 TextDrawHideForAll(EmpezarCarrera);
948 RaceStarted = 1;
949 new string[10];
950 format(string, sizeof(string), "~b~%d", CountAmountRace);
951 foreach(new i : Player) if(Usuario[i][EsCorredor] == true)
952 {
953 GameTextForPlayer(i, string, 999, 5);
954 PlayerPlaySound(i, 1056, 0.0, 0.0, 0.0);
955 PlayerTextDrawShow(i, RaceInfoText);
956 }
957 }
958 if(CountAmountRace <= 0) StartRace();
959 return CountAmountRace--;
960}
961
962CallBack: StartRace()
963{
964 stop CountTimer;
965 if(JoinCount < 0) return DetenerCarrera(), SendClientMessageToAll(COLOR_AMARILLO, "« Info » "COL_BLANCO"Carrera cancelada. [Razón: No habÃa suficientes jugadores]");
966 foreach(new i : Player)
967 {
968 if(Usuario[i][EsCorredor] == true)
969 {
970 TogglePlayerControllable(i, true);
971 PlayerPlaySound(i, 1057, 0.0, 0.0, 0.0);
972 GameTextForPlayer(i, "~g~GO GO GO", 2000, 5);
973 SetCameraBehindPlayer(i);
974 DisableRemoteVehicleCollisions(i,1);
975 ResetPlayerWeapons(i);
976 }
977 }
978 rCounter = repeat RaceCounter();
979 RaceTick = GetTickCount();
980 RaceStarted = 2;
981 return 1;
982}
983
984CallBack: DetenerCarrera()
985{
986 stop rCounter;
987 RaceStarted = 0;
988 RaceTick = 0;
989 RaceBusy = 0x00;
990 JoinCount = 0;
991 FinishCount = 0;
992 TimeProgress = 0;
993
994 foreach(new i : Player)
995 {
996 if(Usuario[i][EsCorredor] == true)
997 {
998 DisablePlayerRaceCheckpoint(i);
999 Usuario[i][EsCorredor] = false;
1000 SetVehicleHealth(GetPlayerVehicleID(i),1250.0);
1001 SpawnPlayer(i);
1002 PlayerTextDrawHide(i, RaceInfoText);
1003 DisableRemoteVehicleCollisions(i,0);
1004 Usuario[i][CPProgess] = 0;
1005 stop Usuario[i][InfoTimer];
1006 }
1007 }
1008
1009 for(new i;i<MAX_CP_POR_CARRERA;i++)
1010 {
1011 CPCoords[i][0]=0.0;
1012 CPCoords[i][1]=0.0;
1013 CPCoords[i][2]=0.0;
1014 CPCoords[i][3]=0.0;
1015 }
1016 foreach(new i : Player)
1017 {
1018 Usuario[i][CPProgess] = 0;
1019 CPCoords[i][3] = 0;
1020 }
1021 return 1;
1022}
1023
1024timer RaceCounter[1000]()
1025{
1026 if(RaceStarted == 2)
1027 {
1028 RaceTime--;
1029 if(JoinCount <= 0)
1030 {
1031 DetenerCarrera();
1032 SendClientMessageToAll(COLOR_AMARILLO, "« Info » "COL_BLANCO"Carrera terminada, no hay corredores.");
1033 }
1034 }
1035 if(RaceTime <= 0)
1036 {
1037 DetenerCarrera();
1038 SendClientMessageToAll(COLOR_AMARILLO, "« Info » "COL_BLANCO"Carrera terminada, se acabó el tiempo.");
1039 }
1040 return 1;
1041}
1042
1043timer TextInfo[200](playerid)
1044{
1045 new string[200];
1046 if(JoinCount == 1)
1047 format(string, sizeof(string), "Puntos de control: ~b~%d~y~/~b~%d ~w~Tiempo: ~b~%s ~y~- ~w~Posici¦n: ~b~1~y~/~b~1", Usuario[playerid][CPProgess], TotalCP, TimeConvert(RaceTime));
1048 else
1049 format(string, sizeof(string), "Puntos de control: ~b~%d~y~/~b~%d ~w~Tiempo: ~b~%s ~y~- ~w~Posici¦n: ~b~%d~y~/~b~%d", Usuario[playerid][CPProgess], TotalCP, TimeConvert(RaceTime), Usuario[playerid][PosicionCarrera], JoinCount);
1050 PlayerTextDrawSetString(playerid,RaceInfoText,string);
1051}
1052
1053CallBack: Camera(playerid, Float:X, Float:Y, Float:Z, Float:A, Mul)
1054{
1055 SetPlayerCameraLookAt(playerid, X, Y, Z);
1056 SetPlayerCameraPos(playerid, X + (Mul * floatsin(-A, degrees)), Y + (Mul * floatcos(-A, degrees)), Z+6);
1057}
1058
1059CallBack: MostrarDialogo(playerid, dialogid)
1060{
1061 switch(dialogid)
1062 {
1063 case 599: ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_LIST, "Crear una carrera - (Inicio)", "\
1064 Carrera Normal\n\
1065 Carrera por Aire", "Siguiente", "Salir");
1066
1067 case 600: ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_INPUT, "Crear una carrera (Paso 1/4)", "\
1068 {FFFFFF}Paso #1:\n\
1069 Bienvenido a la herramienta para crear una nueva carrera.\n\
1070 Antes de empezar necesito que escribas el nombre de la carrera, (ejemplo: Mi_Carrera1)\n\
1071 {FF0000}NOTA: {FFFFFF}El nombre debe ser menor a 20 y mayor que 5",\
1072 "Siguiente", "Atrás");
1073
1074 case 601: ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_INPUT, "Crear una carrera (Paso 1/4)", "\
1075 {FF0000}ERROR: {FFFFFF}El nombre de la carrera es muy largo o muy corto (mÃnimo 5 - máximo 20)\n\n\
1076 {FFFFFF}Paso #1:\n\
1077 Bienvenido a la herramienta para crear una nueva carrera.\n\
1078 Antes de empezar necesito que escribas el nombre de la carrera, (ejemplo: Mi_Carrera1)\n\
1079 {FF0000}NOTA: {FFFFFF}El nombre debe ser menor a 20 y mayor que 5",\
1080 "Siguiente", "Atrás");
1081
1082 case 602: ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_INPUT, "Crear una carrera (Paso 2/4)", "\
1083 {FFFFFF}Paso #2:\n\
1084 Escribe el nombre(ejemplo: Infernus) o el ID(ejemplo: 411) del auto que será usado en la carrera.\n",\
1085 "Ok", "Atrás");
1086
1087 case 603: ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_INPUT, "Crear una carrera (Paso 2/4)", "\
1088 {FF0000}ERROR: {FFFFFF}El nombre o el ID del auto es inválido\n\n\
1089 {FFFFFF}Paso #2:\n\
1090 Escribe el nombre(ejemplo: Infernus) o el ID(ejemplo: 411) del auto que será usado en la carrera.\n",\
1091 "Ok", "Atrás");
1092
1093 case 604: ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_MSGBOX, "Crear una carrera (Paso 3/4)", "\
1094 {FFFFFF}Paso #3:\n\
1095 Ve a la lÃnea de meta y elige la posición del primer auto y luego la del segundo.\n\
1096 {FF0000}NOTA: {FFFFFF}Cuando presiona 'Ok' serás libre de presionar 'CLIC' para colocar las posiciones.\n\
1097 {FF0000}NOTA: {FFFFFF}Después de colocar las posiciones, verás el siguiente dialogo para continuar\n",\
1098 "Ok", "Atrás");
1099
1100 case 605: ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_MSGBOX, "Crear una carrera (Paso 4/4)", "\
1101 {FFFFFF}Paso #4:\n\
1102 Bienvenido a la última etapa de la construcción, en esta etapa podrás colocar los puntos de control.\n\
1103 Cada vez que presiones 'CLIC' o 'CTRL' se colocará un punto de control el cual será guardado automáticamente.\n",\
1104 "Ok", "Atrás");
1105
1106 case 606:
1107 {
1108 new str[400];
1109 format(str, 500, ""COL_BLANCO"Has creado una carrera y está lista para ser usada.\n\
1110 Datos de la carrera:\n\
1111 Nombre: "COL_VERDE"%s\n\
1112 "COL_BLANCO"Puntos de control: "COL_VERDE"%d\n\
1113 "COL_BLANCO"VehÃculo: "COL_VERDE"%s\n\
1114 "COL_BLANCO"Tipo de carrera: "COL_VERDE"%s\n\
1115 "COL_BLANCO"Presiona 'Salir' para cerrar el dialogo.",BuildName,BuildCheckPointCount,GetVehicleName(BuildModeVID),BuildRaceType == 0 ? ("Terrestre") : ("Aérea"));
1116 ShowPlayerDialog(playerid, dialogid, DIALOG_STYLE_MSGBOX, "Crear una carrera (Hecho)",str, "Salir", "");
1117 }
1118 }
1119 return 1;
1120}
1121
1122stock IsValidVehicle(vehicleid)
1123{
1124 if(vehicleid < 400 || vehicleid > 611) return false; else return true;
1125}
1126
1127ReturnVehicleID(vName[])
1128{
1129 Loop(x, 211)
1130 {
1131 if(strfind(g_arrVehicleNames[x], vName, true) != -1)
1132 return x + 400;
1133 }
1134 return -1;
1135}
1136
1137GetVehicleName(model)
1138{
1139 new name[32] = "None";
1140 if (model < 400 || model > 611) return name;
1141
1142 format(name, sizeof(name), g_arrVehicleNames[model - 400]);
1143 return name;
1144}
1145
1146AlmacenarTiempoCarrera(nombreCarrera[], posicionLlegada, tiempoCarrera, nombreCorredor)
1147{
1148 new DB:bd = db_open(sql_database);
1149
1150 if(bd)
1151 {
1152 new consulta[256];
1153
1154 format(consulta, sizeof (consulta), "INSERT INTO TIEMPO_CARRERA (ID_CARRERA, NUMERO_POSICION, TIEMPO, NOMBRE_CORREDOR) \
1155 VALUES ((SELECT ID_CARRERA FROM CARRERA WHERE NOMBRE = '%q'), %i, %i, '%d')", nombreCarrera, posicionLlegada, tiempoCarrera, nombreCorredor);
1156 db_free_result(db_query(bd, consulta));
1157 db_close(bd);
1158 }
1159}
1160
1161ActualizarTiempoCarrera(nombreCarrera[], posicionLlegada, tiempoCarrera, nombreCorredor)
1162{
1163 new DB:bd = db_open(sql_database);
1164
1165 if(bd)
1166 {
1167 new consulta[256];
1168
1169 format(consulta, sizeof (consulta), "UPDATE TIEMPO_CARRERA SET TIEMPO = %i, NOMBRE_CORREDOR = '%d' WHERE ID_CARRERA = \
1170 (SELECT ID_CARRERA FROM CARRERA WHERE NOMBRE = '%q') AND NUMERO_POSICION = %i", tiempoCarrera, nombreCorredor, nombreCarrera, posicionLlegada);
1171
1172 db_free_result(db_query(bd, consulta));
1173 db_close(bd);
1174 }
1175}
1176
1177EsTiempoRecord(nombreCarrera[], posicionLlegada, tiempoCarrera)
1178{
1179 new DB:bd = db_open(sql_database), bool:esTiempoRecord = false;
1180
1181 if(bd)
1182 {
1183 new consulta[256], DBResult:resultado;
1184
1185 format(consulta, sizeof (consulta), "SELECT 1 FROM TIEMPO_CARRERA WHERE ID_CARRERA = (SELECT ID_CARRERA FROM CARRERA WHERE NOMBRE = '%q') \
1186 AND NUMERO_POSICION = %i AND TIEMPO < %i LIMIT 1", nombreCarrera, posicionLlegada, tiempoCarrera);
1187 resultado = db_query(bd, consulta);
1188
1189 esTiempoRecord = db_num_rows(resultado) == 0;
1190 db_free_result(resultado);
1191 db_close(bd);
1192 }
1193 return esTiempoRecord;
1194}
1195
1196HayTiemposRegistrados(nombreCarrera[], posicionLlegada)
1197{
1198 new DB:bd = db_open(sql_database), bool:hayTiemposRegistrados = true;
1199
1200 if(bd)
1201 {
1202 new consulta[168], DBResult:resultado;
1203
1204 format(consulta, sizeof (consulta), "SELECT 1 FROM TIEMPO_CARRERA WHERE ID_CARRERA = (SELECT ID_CARRERA FROM CARRERA WHERE NOMBRE = '%q') AND NUMERO_POSICION = %i LIMIT 1", nombreCarrera, posicionLlegada);
1205 resultado = db_query(bd, consulta);
1206
1207 hayTiemposRegistrados = db_num_rows(resultado) > 0;
1208 db_free_result(resultado);
1209 db_close(bd);
1210 }
1211 return hayTiemposRegistrados;
1212}
1213
1214ObtenerRecordPrevio(nombreCarrera[], posicionLlegada, tiempoCarrera, &nombreCorredorRP, &tiempoRecordPrevio)
1215{
1216 new DB:bd = db_open(sql_database);
1217
1218 if (bd)
1219 {
1220 new consulta[256], DBResult:resultado;
1221
1222 format(consulta, sizeof (consulta), "SELECT NOMBRE_CORREDOR, TIEMPO FROM TIEMPO_CARRERA WHERE ID_CARRERA = (SELECT ID_CARRERA FROM CARRERA WHERE NOMBRE = '%q') \
1223 AND NUMERO_POSICION = %i AND TIEMPO >= %i ORDER BY TIEMPO ASC LIMIT 1", nombreCarrera, posicionLlegada, tiempoCarrera);
1224 resultado = db_query(bd, consulta);
1225
1226 if (db_num_rows(resultado) > 0)
1227 {
1228 nombreCorredorRP = db_get_field_assoc_int(resultado, "NOMBRE_CORREDOR");
1229 tiempoRecordPrevio = db_get_field_assoc_int(resultado, "TIEMPO");
1230 }
1231 db_free_result(resultado);
1232 db_close(bd);
1233 }
1234}
1235/*
1236ObtenerRecordNombre(idCarrera, &nombreCorredorRP, &tiempoRecordPrevio)
1237{
1238 new DB:bd = db_open(sql_database);
1239
1240 if(bd)
1241 {
1242 new consulta[256], DBResult:resultado;
1243
1244 format(consulta, sizeof (consulta), "SELECT NOMBRE_CORREDOR, TIEMPO FROM TIEMPO_CARRERA WHERE ID_CARRERA = (SELECT ID_CARRERA FROM CARRERA WHERE ID_CARRERA = '%i') \
1245 AND NUMERO_POSICION = 1 ORDER BY TIEMPO ASC LIMIT 1", idCarrera);
1246 resultado = db_query(bd, consulta);
1247
1248 if (db_num_rows(resultado) > 0)
1249 {
1250 nombreCorredorRP = db_get_field_assoc_int(resultado, "NOMBRE_CORREDOR");
1251 tiempoRecordPrevio = db_get_field_assoc_int(resultado, "TIEMPO");
1252 }
1253 else if (db_num_rows(resultado) == 0) nombreCorredorRP = 0;
1254 db_free_result(resultado);
1255 db_close(bd);
1256 }
1257}
1258*/
1259stock EsNumerico(string[])
1260{
1261 for (new i = 0, j = strlen(string); i < j; i++)
1262 {
1263 if (string[i] > '9' || string[i] < '0')
1264 return 0;
1265 }
1266 return 1;
1267}
1268
1269BorrarCarrera(nombreCarrera[])
1270{
1271 new DB:bd = db_open(sql_database);
1272
1273 if(bd)
1274 {
1275 new consulta[256], DBResult:resultado;
1276
1277 format(consulta, sizeof (consulta), "SELECT 1 FROM CARRERA WHERE NOMBRE = '%q' LIMIT 1", nombreCarrera);
1278 resultado = db_query(bd, consulta);
1279
1280 if(db_num_rows(resultado) > 0)
1281 {
1282 format(consulta, sizeof (consulta), "DELETE FROM TIEMPO_CARRERA WHERE ID_CARRERA = (SELECT ID_CARRERA FROM CARRERA WHERE NOMBRE = '%q')", nombreCarrera);
1283 db_free_result(db_query(bd, consulta));
1284
1285 format(consulta, sizeof (consulta), "DELETE FROM PUNTO_CONTROL_CARRERA WHERE ID_CARRERA = (SELECT ID_CARRERA FROM CARRERA WHERE NOMBRE = '%q')", nombreCarrera);
1286 db_free_result(db_query(bd, consulta));
1287
1288 format(consulta, sizeof (consulta), "DELETE FROM POSICION_PARTIDA_CARRERA WHERE ID_CARRERA = (SELECT ID_CARRERA FROM CARRERA WHERE NOMBRE = '%q')", nombreCarrera);
1289 db_free_result(db_query(bd, consulta));
1290
1291 format(consulta, sizeof (consulta), "DELETE FROM CARRERA WHERE NOMBRE = '%q'", nombreCarrera);
1292 db_free_result(db_query(bd, consulta));
1293 }
1294 db_free_result(resultado);
1295 db_free_result(db_query(bd, consulta));
1296 db_close(bd);
1297 }
1298}
1299
1300
1301AgregarCarrera(nombreCarrera[], modeloVehiculo, tipoCarrera)
1302{
1303 new DB:bd = db_open(sql_database);
1304
1305 if(bd)
1306 {
1307 new consulta[256], DBResult:resultado;
1308
1309 format(consulta, sizeof (consulta), "SELECT 1 FROM CARRERA WHERE NOMBRE = '%q' LIMIT 1", nombreCarrera);
1310 resultado = db_query(bd, consulta);
1311
1312 if(db_num_rows(resultado) > 0)
1313 {
1314 format(consulta, sizeof (consulta), "DELETE FROM TIEMPO_CARRERA WHERE ID_CARRERA = (SELECT ID_CARRERA FROM CARRERA WHERE NOMBRE = '%q')", nombreCarrera);
1315 db_free_result(db_query(bd, consulta));
1316
1317 format(consulta, sizeof (consulta), "DELETE FROM PUNTO_CONTROL_CARRERA WHERE ID_CARRERA = (SELECT ID_CARRERA FROM CARRERA WHERE NOMBRE = '%q')", nombreCarrera);
1318 db_free_result(db_query(bd, consulta));
1319
1320 format(consulta, sizeof (consulta), "DELETE FROM POSICION_PARTIDA_CARRERA WHERE ID_CARRERA = (SELECT ID_CARRERA FROM CARRERA WHERE NOMBRE = '%q')", nombreCarrera);
1321 db_free_result(db_query(bd, consulta));
1322
1323 format(consulta, sizeof (consulta), "DELETE FROM CARRERA WHERE NOMBRE = '%q'", nombreCarrera);
1324 db_free_result(db_query(bd, consulta));
1325 }
1326 format(consulta, sizeof (consulta), "INSERT INTO CARRERA (NOMBRE, MODELO_VEHICULO, TIPO_CARRERA) VALUES ('%q', %i, %i)", nombreCarrera, modeloVehiculo, tipoCarrera);
1327 db_free_result(resultado);
1328 db_free_result(db_query(bd, consulta));
1329 db_close(bd);
1330 }
1331}
1332
1333AgregarPosicionPartida(nombreCarrera[], posicion, Float:x, Float:y, Float:z, Float:r)
1334{
1335 new DB:bd = db_open(sql_database);
1336
1337 if(bd)
1338 {
1339 new consulta[512];
1340
1341 format(consulta, sizeof (consulta), "INSERT INTO POSICION_PARTIDA_CARRERA (ID_CARRERA, NUMERO_POSICION, COORDENADA_X, COORDENADA_Y, COORDENADA_Z, ROTACION) \
1342 VALUES ((SELECT ID_CARRERA FROM CARRERA WHERE NOMBRE = '%q'), %i, %f, %f, %f, %f)", nombreCarrera, posicion, x, y, z, r);
1343
1344 db_free_result(db_query(bd, consulta));
1345 db_close(bd);
1346 }
1347}
1348
1349AgregarPuntoControl(nombreCarrera[], numeroPuntoControl, Float:x, Float:y, Float:z)
1350{
1351 new DB:bd = db_open(sql_database);
1352
1353 if(bd)
1354 {
1355 new consulta[512];
1356
1357 format(consulta, sizeof (consulta), "INSERT INTO PUNTO_CONTROL_CARRERA (ID_CARRERA, ID_PUNTO_CONTROL, COORDENADA_X, COORDENADA_Y, COORDENADA_Z) \
1358 VALUES ((SELECT ID_CARRERA FROM CARRERA WHERE NOMBRE = '%q'), %i, %f, %f, %f)", nombreCarrera, numeroPuntoControl, x, y, z);
1359
1360 db_free_result(db_query(bd, consulta));
1361 db_close(bd);
1362 }
1363}
1364
1365ContarCarrerasAlmacenadas()
1366{
1367 new DB:bd = db_open(sql_database), numeroCarreras = 0;
1368
1369 if(bd)
1370 {
1371 new DBResult:resultado = db_query(bd, "SELECT 1 FROM CARRERA");
1372
1373 numeroCarreras = db_num_rows(resultado);
1374 db_free_result(resultado);
1375 db_close(bd);
1376 }
1377 return numeroCarreras;
1378}
1379
1380ExisteCarrera(idCarrera)
1381{
1382 new DB:bd = db_open(sql_database), bool:existeCarrera = false;
1383
1384 if(bd)
1385 {
1386 new consulta[256], DBResult:resultado;
1387
1388 format(consulta, sizeof (consulta), "SELECT 1 FROM CARRERA WHERE ID_CARRERA = '%d' LIMIT 1", idCarrera);
1389 resultado = db_query(bd, consulta);
1390
1391 existeCarrera = db_num_rows(resultado) > 0;
1392 db_free_result(resultado);
1393 db_close(bd);
1394 }
1395 return existeCarrera;
1396}
1397
1398CargarDatosCarrera(idCarrera, &modeloVehiculo, &tipoCarrera)
1399{
1400 new DB:bd = db_open(sql_database);
1401
1402 if(bd)
1403 {
1404 new consulta[256], DBResult:resultado;
1405
1406 format(consulta, sizeof (consulta), "SELECT MODELO_VEHICULO, TIPO_CARRERA FROM CARRERA WHERE ID_CARRERA = '%d' LIMIT 1", idCarrera);
1407 resultado = db_query(bd, consulta);
1408
1409 if (db_num_rows(resultado))
1410 {
1411 modeloVehiculo = db_get_field_assoc_int(resultado, "MODELO_VEHICULO");
1412 tipoCarrera = db_get_field_assoc_int(resultado, "TIPO_CARRERA");
1413 }
1414 db_free_result(resultado);
1415 db_close(bd);
1416 }
1417}
1418
1419ContarPuntosControl(idCarrera)
1420{
1421 new DB:bd = db_open(sql_database), numPuntosControl = 0;
1422
1423 if(bd)
1424 {
1425 new consulta[256], DBResult:resultado;
1426
1427 format(consulta, sizeof (consulta), "SELECT 1 FROM PUNTO_CONTROL_CARRERA \
1428 WHERE ID_CARRERA = (SELECT ID_CARRERA FROM CARRERA WHERE ID_CARRERA = '%d')", idCarrera);
1429
1430 resultado = db_query(bd, consulta);
1431 numPuntosControl = db_num_rows(resultado);
1432 db_free_result(resultado);
1433 db_close(bd);
1434 }
1435 return numPuntosControl;
1436}
1437
1438CargarPosicionCarrera(idCarrera, posicion, &Float:coordenadaX, &Float:coordenadaY, &Float:coordenadaZ, &Float:rotacion)
1439{
1440 new DB:bd = db_open(sql_database);
1441
1442 if(bd)
1443 {
1444 new consulta[512], DBResult:resultado;
1445
1446 format(consulta, sizeof (consulta), "SELECT COORDENADA_X, COORDENADA_Y, COORDENADA_Z, ROTACION FROM POSICION_PARTIDA_CARRERA \
1447 WHERE ID_CARRERA = (SELECT ID_CARRERA FROM CARRERA WHERE ID_CARRERA = '%d') \
1448 AND NUMERO_POSICION = %i LIMIT 1", idCarrera, posicion);
1449
1450 resultado = db_query(bd, consulta);
1451 if (db_num_rows(resultado))
1452 {
1453 coordenadaX = db_get_field_assoc_float(resultado, "COORDENADA_X");
1454 coordenadaY = db_get_field_assoc_float(resultado, "COORDENADA_Y");
1455 coordenadaZ = db_get_field_assoc_float(resultado, "COORDENADA_Z");
1456 rotacion = db_get_field_assoc_float(resultado, "ROTACION");
1457 }
1458 db_free_result(resultado);
1459 db_close(bd);
1460 }
1461}
1462
1463CargarPuntosDeControl(idCarrera, idPuntoControl, &Float:coordenadaX, &Float:coordenadaY, &Float:coordenadaZ)
1464{
1465 new DB:bd = db_open(sql_database);
1466 if(bd)
1467 {
1468 new consulta[512], DBResult:resultado;
1469 format(consulta, sizeof (consulta), "SELECT COORDENADA_X, COORDENADA_Y, COORDENADA_Z FROM PUNTO_CONTROL_CARRERA \
1470 WHERE ID_CARRERA = (SELECT ID_CARRERA FROM CARRERA WHERE ID_CARRERA = '%d') \
1471 AND ID_PUNTO_CONTROL = %i LIMIT 1", idCarrera, idPuntoControl);
1472
1473 resultado = db_query(bd, consulta);
1474 if (db_num_rows(resultado))
1475 {
1476 coordenadaX = db_get_field_assoc_float(resultado, "COORDENADA_X");
1477 coordenadaY = db_get_field_assoc_float(resultado, "COORDENADA_Y");
1478 coordenadaZ = db_get_field_assoc_float(resultado, "COORDENADA_Z");
1479 }
1480 db_free_result(resultado);
1481 db_close(bd);
1482 }
1483}