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