· 8 years ago · Feb 22, 2018, 01:04 AM
1/*
2
3 GM Base en MySQL R41-4 por $Legion
4
5 Estructura:
6
7 1 -> Includes
8 2 -> Defines, enums y variables.
9 3 -> Funciones
10 4 -> Callbacks
11 5 -> Comandos
12 6 -> Flags
13 ...
14 ...
15 ...
16*/
17
18
19//1 -> Includes
20#include <a_samp>
21#include <a_mysql>
22#include <streamer>
23#include <sscanf2>
24#include <Pawn.CMD>
25
26
27native WP_Hash(buffer[], len, const str[]);
28
29
30//2 -> Defines, enums y variables.
31
32
33//Debe cambiar esto a los slots que usará en su servidor
34#undef MAX_PLAYERS
35#define MAX_PLAYERS 100
36
37//Kick FIX
38#define KICK(%0) SetTimerEx("KICK_FIX", 500, false, "d", %0)
39
40//Máximo de intentos fallidos para loguearse
41#define MAX_INTENTOS_INGRESO (3)
42
43//Conexión
44#define MYSQL_USER "root"
45#define MYSQL_PASSWORD ""
46#define MYSQL_DATABASE "rp_base"
47#define MYSQL_HOST "127.0.0.1"
48
49
50new MySQL:DATABASE;
51
52enum
53{
54 DIALOG_INFO,
55 DIALOG_REGISTRO,
56 DIALOG_INGRESO,
57 DIALOG_GENERO,
58 DIALOG_EDAD
59};
60
61enum
62{
63 CMD_USUARIO,
64 CMD_MODERADOR,
65 CMD_ADMINISTRADOR
66};
67
68new RANGOS_ADMINISTRATIVOS[][] =
69{
70 "Usuario",
71 "Moderador",
72 "Administrador"
73};
74
75enum E_INFO_CUENTA
76{
77 c_ID,
78 c_NOMBRE[MAX_PLAYER_NAME],
79 c_CLAVE[128 + 1],
80 c_IP_REGISTRO[16],
81 c_ADMIN
82};
83
84enum E_INFO_JUGADOR
85{
86 p_ID,
87 p_GENERO,
88 p_EDAD,
89 p_SKIN,
90 p_DINERO,
91 p_VIRTUALWORLD,
92 p_INTERIOR,
93 Float:p_VIDA,
94 Float:p_CHALECO,
95 Float:p_POS_X,
96 Float:p_POS_Y,
97 Float:p_POS_Z,
98 Float:p_POS_A
99};
100
101enum E_TEMPORAL
102{
103 t_NOMBRE[MAX_PLAYER_NAME],
104 t_IP[16],
105 bool:t_LOGUEADO,
106 bool:t_ADMINDUTY,
107 t_INTENTOS_INGRESO
108};
109
110//Cuenta
111new CUENTA[MAX_PLAYERS][E_INFO_CUENTA];
112
113//Personaje
114new PERSONAJE[MAX_PLAYERS][E_INFO_JUGADOR];
115
116//Temporal
117new TEMPORAL[MAX_PLAYERS][E_TEMPORAL];
118
119
120//3 -> Funciones
121CONEXION_MYSQL()
122{
123 DATABASE = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE);
124 mysql_log(ERROR | WARNING);
125
126 print("[SQL] -> Intentando conectar a <"MYSQL_DATABASE"@"MYSQL_HOST">");
127
128 if(!mysql_errno(DATABASE))
129 {
130 print("[SQL] -> Se ha conectado a <"MYSQL_DATABASE"@"MYSQL_HOST"> exitosamente");
131 return 1;
132 }
133 else
134 {
135 print("[SQL] -> Error al conectar con <"MYSQL_DATABASE"@"MYSQL_HOST">. Intentando reconexión...");
136
137 if(!mysql_errno(DATABASE))
138 {
139 print("[SQL] -> Reconexión con <"MYSQL_DATABASE"@"MYSQL_HOST"> exitosa");
140 return 1;
141 }
142 else
143 {
144 print("[SQL] -> Reconexión con <"MYSQL_DATABASE"@"MYSQL_HOST"> fallida. Abortando...");
145 return 0;
146 }
147 }
148}
149
150CREAR_TABLAS()
151{
152 mysql_tquery(DATABASE, "CREATE TABLE IF NOT EXISTS `cuentas` \
153 ( \
154 ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT, \
155 NOMBRE VARCHAR(24) NOT NULL, \
156 CONTRASEÑA VARCHAR(129) NOT NULL, \
157 IP_REGISTRO VARCHAR(16) NOT NULL, \
158 ADMIN INT NOT NULL DEFAULT 0 \
159 ) \
160 ENGINE=InnoDB DEFAULT CHARSET=utf8;");
161
162
163 mysql_tquery(DATABASE, "CREATE TABLE IF NOT EXISTS `personajes` \
164 ( \
165 ID INT NOT NULL PRIMARY KEY, \
166 GENERO INT NOT NULL DEFAULT 0, \
167 EDAD INT NOT NULL DEFAULT 0, \
168 SKIN INT NOT NULL DEFAULT 0, \
169 DINERO INT NOT NULL DEFAULT 0, \
170 VIRTUALWORLD INT NOT NULL DEFAULT 0, \
171 INTERIOR INT NOT NULL DEFAULT 0, \
172 VIDA FLOAT NOT NULL DEFAULT 0, \
173 CHALECO FLOAT NOT NULL DEFAULT 0, \
174 POS_X FLOAT NOT NULL DEFAULT 0, \
175 POS_Y FLOAT NOT NULL DEFAULT 0, \
176 POS_Z FLOAT NOT NULL DEFAULT 0, \
177 POS_A FLOAT NOT NULL DEFAULT 0, \
178 CONFIGURADO INT NOT NULL DEFAULT 0 \
179 ) \
180 ENGINE=InnoDB DEFAULT CHARSET=utf8;");
181 return 1;
182}
183
184NUEVO_REGISTRO(playerid)
185{
186 new QUERY[129 + 200];
187 mysql_format(DATABASE, QUERY, sizeof(QUERY),
188 "INSERT INTO `cuentas` (NOMBRE, CONTRASEÑA, IP_REGISTRO, ADMIN) VALUES ('%e', '%e', '%e', 0);",
189 TEMPORAL[playerid][t_NOMBRE],
190 CUENTA[playerid][c_CLAVE],
191 CUENTA[playerid][c_IP_REGISTRO]);
192 mysql_tquery(DATABASE, QUERY, "CARGAR_NUEVA_ID", "i", playerid);
193 return 1;
194}
195
196CARGAR_PERSONAJE(playerid)
197{
198 if(!CUENTA[playerid][c_ID]) return 0;
199
200 new QUERY[100];
201 mysql_format(DATABASE, QUERY, sizeof(QUERY), "SELECT * FROM `personajes` WHERE `ID` = %d;", CUENTA[playerid][c_ID]);
202 mysql_tquery(DATABASE, QUERY, "VERIFICAR_PERSONAJE", "i", playerid);
203 return 1;
204}
205
206PERSONAJE_CARGADO(playerid)
207{
208 SetPlayerVirtualWorld(playerid, PERSONAJE[playerid][p_VIRTUALWORLD]);
209 SetPlayerInterior(playerid, PERSONAJE[playerid][p_INTERIOR]);
210 SetPlayerHealth(playerid, PERSONAJE[playerid][p_VIDA]);
211 SetPlayerArmour(playerid, PERSONAJE[playerid][p_CHALECO]);
212
213 ResetPlayerMoney(playerid);
214 GivePlayerMoney(playerid, PERSONAJE[playerid][p_DINERO]);
215
216 SetSpawnInfo(playerid, NO_TEAM, PERSONAJE[playerid][p_SKIN], PERSONAJE[playerid][p_POS_X], PERSONAJE[playerid][p_POS_Y], PERSONAJE[playerid][p_POS_Z], PERSONAJE[playerid][p_POS_A], 0, 0, 0, 0, 0, 0);
217 TogglePlayerSpectating(playerid, false);
218 return 1;
219}
220
221TERMINAR_REGISTRO(playerid)
222{
223 TEMPORAL[playerid][t_LOGUEADO] = true;
224
225 PERSONAJE[playerid][p_POS_X] = 1529.6;
226 PERSONAJE[playerid][p_POS_Y] = -1691.2;
227 PERSONAJE[playerid][p_POS_Z] = 13.3;
228 PERSONAJE[playerid][p_POS_A] = 0;
229 PERSONAJE[playerid][p_VIRTUALWORLD] = 0;
230 PERSONAJE[playerid][p_INTERIOR] = 0;
231 PERSONAJE[playerid][p_SKIN] = ( (PERSONAJE[playerid][p_GENERO] == 1) ? (26) : (56) );
232 PERSONAJE[playerid][p_VIDA] = 50.0;
233 SetPlayerHealth(playerid, PERSONAJE[playerid][p_VIDA]);
234
235 SetPlayerVirtualWorld(playerid, PERSONAJE[playerid][p_VIRTUALWORLD]);
236 SetPlayerInterior(playerid, PERSONAJE[playerid][p_INTERIOR]);
237
238 PERSONAJE[playerid][p_DINERO] = 3500;
239 ResetPlayerMoney(playerid);
240 GivePlayerMoney(playerid, PERSONAJE[playerid][p_DINERO]);
241
242 SetSpawnInfo(playerid, NO_TEAM, PERSONAJE[playerid][p_SKIN], PERSONAJE[playerid][p_POS_X], PERSONAJE[playerid][p_POS_Y], PERSONAJE[playerid][p_POS_Z], PERSONAJE[playerid][p_POS_A], 0, 0, 0, 0, 0, 0);
243
244 new QUERY[70];
245 mysql_format(DATABASE, QUERY, sizeof(QUERY), "UPDATE `personajes` SET `CONFIGURADO` = 1 WHERE `ID` = %d;", CUENTA[playerid][c_ID]);
246 mysql_tquery(DATABASE, QUERY);
247
248
249 TogglePlayerSpectating(playerid, false);
250 GUARDAR_PERSONAJE(playerid);
251 return 1;
252}
253
254GUARDAR_PERSONAJE(playerid)
255{
256 if(TEMPORAL[playerid][t_LOGUEADO])
257 {
258 new QUERY[400];
259 print("Se ejecuto");
260 GetPlayerPos(playerid, PERSONAJE[playerid][p_POS_X], PERSONAJE[playerid][p_POS_Y], PERSONAJE[playerid][p_POS_Z]);
261 GetPlayerFacingAngle(playerid, PERSONAJE[playerid][p_POS_A]);
262
263 PERSONAJE[playerid][p_VIRTUALWORLD] = GetPlayerVirtualWorld(playerid);
264 PERSONAJE[playerid][p_INTERIOR] = GetPlayerInterior(playerid);
265
266 mysql_format(DATABASE, QUERY, sizeof(QUERY), "UPDATE `personajes` SET \
267 \
268 `GENERO` = %d,\
269 `EDAD` = %d,\
270 `SKIN` = %d,\
271 `DINERO` = %d,\
272 `VIRTUALWORLD` = %d,\
273 `INTERIOR` = %d,\
274 `VIDA` = %f,\
275 `CHALECO` = %f,\
276 `POS_X` = %f,\
277 `POS_Y` = %f,\
278 `POS_Z` = %f,\
279 `POS_A` = %f\
280 \
281 WHERE `ID` = %d;",
282 PERSONAJE[playerid][p_GENERO],
283 PERSONAJE[playerid][p_EDAD],
284 PERSONAJE[playerid][p_SKIN],
285 PERSONAJE[playerid][p_DINERO],
286 PERSONAJE[playerid][p_VIRTUALWORLD],
287 PERSONAJE[playerid][p_INTERIOR],
288 PERSONAJE[playerid][p_VIDA],
289 PERSONAJE[playerid][p_CHALECO],
290 PERSONAJE[playerid][p_POS_X],
291 PERSONAJE[playerid][p_POS_Y],
292 PERSONAJE[playerid][p_POS_Z],
293 PERSONAJE[playerid][p_POS_A],
294 CUENTA[playerid][c_ID]);
295 mysql_tquery(DATABASE, QUERY);
296 }
297 return 1;
298}
299
300ProxDetector(Float:radi, playerid, string[],col1,col2,col3,col4,col5)
301{
302 if(IsPlayerConnected(playerid))
303 {
304 new Float:posx, Float:posy, Float:posz;
305 new Float:oldposx, Float:oldposy, Float:oldposz;
306 new Float:tempposx, Float:tempposy, Float:tempposz;
307 GetPlayerPos(playerid, oldposx, oldposy, oldposz);
308 for(new i = 0; i <= GetPlayerPoolSize(); i++)
309 {
310 if(IsPlayerConnected(i) && (GetPlayerVirtualWorld(playerid) == GetPlayerVirtualWorld(i)))
311 {
312 GetPlayerPos(i, posx, posy, posz);
313 tempposx = (oldposx -posx);
314 tempposy = (oldposy -posy);
315 tempposz = (oldposz -posz);
316 //printf("DEBUG: X:%f Y:%f Z:%f",posx,posy,posz);
317 if (((tempposx < radi/16) && (tempposx > -radi/16)) && ((tempposy < radi/16) && (tempposy > -radi/16)) && ((tempposz < radi/16) && (tempposz > -radi/16)))
318 {
319 SendClientMessage(i, col1, string);
320 }
321 else if (((tempposx < radi/8) && (tempposx > -radi/8)) && ((tempposy < radi/8) && (tempposy > -radi/8)) && ((tempposz < radi/8) && (tempposz > -radi/8)))
322 {
323 SendClientMessage(i, col2, string);
324 }
325 else if (((tempposx < radi/4) && (tempposx > -radi/4)) && ((tempposy < radi/4) && (tempposy > -radi/4)) && ((tempposz < radi/4) && (tempposz > -radi/4)))
326 {
327 SendClientMessage(i, col3, string);
328 }
329 else if (((tempposx < radi/2) && (tempposx > -radi/2)) && ((tempposy < radi/2) && (tempposy > -radi/2)) && ((tempposz < radi/2) && (tempposz > -radi/2)))
330 {
331 SendClientMessage(i, col4, string);
332 }
333 else if (((tempposx < radi) && (tempposx > -radi)) && ((tempposy < radi) && (tempposy > -radi)) && ((tempposz < radi) && (tempposz > -radi)))
334 {
335 SendClientMessage(i, col5, string);
336 }
337 }
338 }
339 }
340 return 1;
341}
342
343NOMBRE_ROLEPLAY(playerid)
344{
345 new PLAYER_NAME[MAX_PLAYER_NAME];
346 format(PLAYER_NAME, sizeof(PLAYER_NAME), "%s", TEMPORAL[playerid][t_NOMBRE]);
347 for(new i = 0; i < MAX_PLAYER_NAME; i++)
348 {
349 if(PLAYER_NAME[i] == '_') PLAYER_NAME[i] = ' ';
350 }
351 return PLAYER_NAME;
352}
353
354REINICIAR_VARIABLES(playerid)
355{
356 new reiniciar_cuenta[E_INFO_CUENTA]; CUENTA[playerid] = reiniciar_cuenta;
357 new reiniciar_personaje[E_INFO_JUGADOR]; PERSONAJE[playerid] = reiniciar_personaje;
358 new reiniciar_temporales[E_TEMPORAL]; TEMPORAL[playerid] = reiniciar_temporales;
359 return 1;
360}
361
362
363//4 -> Callbacks
364forward KICK_FIX(playerid); public KICK_FIX(playerid) return Kick(playerid);
365
366public OnQueryError(errorid, const error[], const callback[], const query[], MySQL:handle)
367{
368 switch(errorid)
369 {
370 case CR_SERVER_GONE_ERROR:
371 {
372 print("[SQL] Se ha perdido la conexión con "MYSQL_DATABASE". Intentando reconexión...");
373
374 mysql_close(DATABASE);
375 DATABASE = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE);
376 }
377 case ER_SYNTAX_ERROR:
378 {
379 printf("SYNTAX ERROR: %s",query);
380 }
381 }
382 return 1;
383}
384
385main()
386{
387 print("GM Roleplay (MySQL R41-4, cargando...");
388 return 1;
389}
390
391public OnGameModeInit()
392{
393 //Hacemos la conexión con la base de datos
394 CONEXION_MYSQL();
395
396 //Creamos las tablas
397 CREAR_TABLAS();
398 return 1;
399}
400
401public OnGameModeExit()
402{
403 mysql_close(DATABASE);
404 return 1;
405}
406
407public OnPlayerText(playerid, text[])
408{
409 new STRING[128];
410 format(STRING, sizeof(STRING), "%s dice: %s", NOMBRE_ROLEPLAY(playerid), text);
411 ProxDetector(20.0, playerid, STRING, 0xFFFFFFFF, 0xDCDCDCFF, 0xC8C8C8FF, 0xB9B9B9FF, 0x9FA0A0FF);
412 return 0;
413}
414
415public OnPlayerUpdate(playerid)
416{
417 if(!TEMPORAL[playerid][t_LOGUEADO]) return 1;
418
419 if(GetPlayerMoney(playerid) != PERSONAJE[playerid][p_DINERO])
420 {
421 ResetPlayerMoney(playerid);
422 GivePlayerMoney(playerid, PERSONAJE[playerid][p_DINERO]);
423 }
424 return 1;
425}
426
427public OnPlayerDisconnect(playerid, reason)
428{
429 if(TEMPORAL[playerid][t_LOGUEADO])
430 {
431 GUARDAR_PERSONAJE(playerid);
432 }
433 return 1;
434}
435
436public OnPlayerConnect(playerid)
437{
438 REINICIAR_VARIABLES(playerid);
439
440 TogglePlayerSpectating(playerid, true);
441
442 //Seteamos el nombre y la ip a las variables temporales
443 GetPlayerName(playerid, TEMPORAL[playerid][t_NOMBRE], MAX_PLAYER_NAME);
444 GetPlayerIp(playerid, TEMPORAL[playerid][t_IP], 16);
445
446 //Verificamos si el nombre es adecuado para un servidor de rol
447 if(strfind(TEMPORAL[playerid][t_NOMBRE], "_", true) == -1)
448 {
449 ShowPlayerDialog(playerid, DIALOG_INFO, DIALOG_STYLE_MSGBOX, "Atención", "Has ingresado al servidor con un nombre incorrecto\n\nEl formato debe ser 'Nombre_Apellido'", "Salir", "");
450 KICK(playerid);
451 return 1;
452 }
453
454 new QUERY[100];
455 mysql_format(DATABASE, QUERY, sizeof(QUERY), "SELECT * FROM `cuentas` WHERE `NOMBRE` = '%e';", TEMPORAL[playerid][t_NOMBRE]);
456 mysql_tquery(DATABASE, QUERY, "VERIFICAR_CUENTA", "i", playerid);
457 return 1;
458}
459
460
461forward CARGAR_NUEVA_ID(playerid); public CARGAR_NUEVA_ID(playerid)
462{
463 CUENTA[playerid][c_ID] = cache_insert_id();
464
465 new QUERY[64];
466 mysql_format(DATABASE, QUERY, sizeof(QUERY), "INSERT INTO `personajes` (ID) VALUES (%d);", CUENTA[playerid][c_ID]);
467 mysql_tquery(DATABASE, QUERY);
468
469 ShowPlayerDialog(playerid, DIALOG_GENERO, DIALOG_STYLE_MSGBOX, "Elegir genero:", "Seleccione el genero de su personaje", "Masculino", "Femenino");
470 return 1;
471}
472
473forward VERIFICAR_CUENTA(playerid); public VERIFICAR_CUENTA(playerid)
474{
475 new ROWS;
476
477 cache_get_row_count(ROWS);
478
479 if(ROWS)
480 {
481 cache_get_value_name_int(0, "ID", CUENTA[playerid][c_ID]);
482 cache_get_value_name(0, "NOMBRE", CUENTA[playerid][c_NOMBRE], MAX_PLAYER_NAME);
483 cache_get_value_name(0, "CONTRASEÑA", CUENTA[playerid][c_CLAVE], 129);
484 cache_get_value_name(0, "IP_REGISTRO", CUENTA[playerid][c_IP_REGISTRO], 16);
485 cache_get_value_name_int(0, "ADMIN", CUENTA[playerid][c_ADMIN]);
486
487 ShowPlayerDialog(playerid, DIALOG_INGRESO, DIALOG_STYLE_PASSWORD, "Login:", "Escribe tu contraseña para ingresar al servidor", ">>", "<<");
488
489 }
490 else
491 {
492 ShowPlayerDialog(playerid, DIALOG_REGISTRO, DIALOG_STYLE_PASSWORD, "Registro:", "Escribe una contraseña para registrarte en el servidor", ">>", "<<");
493 }
494 return 1;
495}
496
497public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
498{
499 switch(dialogid)
500 {
501 case DIALOG_REGISTRO:
502 {
503 if(response)
504 {
505 if(strlen(inputtext) > 5 && strlen(inputtext) < 25)
506 {
507 WP_Hash(CUENTA[playerid][c_CLAVE], 128 + 1, inputtext);
508 GetPlayerIp(playerid, CUENTA[playerid][c_IP_REGISTRO], 16);
509 NUEVO_REGISTRO(playerid);
510 }
511 else return ShowPlayerDialog(playerid, DIALOG_REGISTRO, DIALOG_STYLE_PASSWORD, "Registro:", "Escribe una contraseña para registrarte en el servidor\n\n[ERROR]: La contraseña debe contener entre 6 y 24 carácteres", ">>", "<<");
512 }
513 return 1;
514 }
515 case DIALOG_INGRESO:
516 {
517 if(response)
518 {
519 if(isnull(inputtext)) return ShowPlayerDialog(playerid, DIALOG_INGRESO, DIALOG_STYLE_PASSWORD, "Login:", "Escribe tu contraseña para ingresar al servidor\n\n[ERROR]: No has ingresado nada", ">>", "<<");
520
521 new HASH[128 + 1];
522 WP_Hash(HASH, sizeof(HASH), inputtext);
523
524 if(!strcmp(CUENTA[playerid][c_CLAVE], HASH, false))
525 {
526 CARGAR_PERSONAJE(playerid);
527 TEMPORAL[playerid][t_LOGUEADO] = true;
528 }
529 else
530 {
531 if(TEMPORAL[playerid][t_INTENTOS_INGRESO] < MAX_INTENTOS_INGRESO)
532 {
533 ShowPlayerDialog(playerid, DIALOG_INGRESO, DIALOG_STYLE_PASSWORD, "Login:", "Escribe tu contraseña para ingresar al servidor\n\n[ERROR]: Contraseña incorrecta", ">>", "<<");
534 TEMPORAL[playerid][t_INTENTOS_INGRESO] ++;
535 }
536 else
537 {
538 SendClientMessage(playerid, -1, "Has fallado muchas veces. Adios");
539 KICK(playerid);
540 }
541 }
542 }
543 return 1;
544 }
545 case DIALOG_GENERO:
546 {
547 if(response) PERSONAJE[playerid][p_GENERO] = 1;
548 else PERSONAJE[playerid][p_GENERO] = 2;
549 SendClientMessage(playerid, -1, ( (PERSONAJE[playerid][p_GENERO] == 1)?("Eres hombre"):("Eres mujer") ) );
550
551 ShowPlayerDialog(playerid, DIALOG_EDAD, DIALOG_STYLE_INPUT, "Su edad:", "Escriba su edad a continuación", "Finalizar", "");
552 return 1;
553 }
554 case DIALOG_EDAD:
555 {
556 if(response)
557 {
558 if(isnull(inputtext)) return ShowPlayerDialog(playerid, DIALOG_EDAD, DIALOG_STYLE_INPUT, "Su edad:", "Escriba su edad a continuación\n\n[ERROR]: No ha ingresado nada", "Finalizar", "");
559
560 if(strval(inputtext) < 15 || strval(inputtext) > 90) return ShowPlayerDialog(playerid, DIALOG_EDAD, DIALOG_STYLE_INPUT, "Su edad:", "Escriba su edad a continuación\n\n[ERROR]: Debe ser entre 15 y 90 años", "Finalizar", "");
561
562 PERSONAJE[playerid][p_EDAD] = strval(inputtext);
563
564 new STRING[24];
565 format(STRING, sizeof(STRING), "Usted tiene %d años", PERSONAJE[playerid][p_EDAD]);
566 SendClientMessage(playerid, -1, STRING);
567
568 TERMINAR_REGISTRO(playerid);
569 }
570 return 1;
571 }
572 }
573 return 0;
574}
575
576public OnPlayerSpawn(playerid)
577{
578 if(TEMPORAL[playerid][t_LOGUEADO])
579 {
580 SendClientMessage(playerid, -1, "Bienvenido");
581 }
582 else
583 {
584 SendClientMessage(playerid, -1, "No has ingresado correctamente al servidor");
585 KICK(playerid);
586 }
587 return 1;
588}
589
590public OnPlayerDeath(playerid)
591{
592 return 1;
593}
594
595forward VERIFICAR_PERSONAJE(playerid); public VERIFICAR_PERSONAJE(playerid)
596{
597 new ROWS;
598
599 cache_get_row_count(ROWS);
600
601 if(ROWS)
602 {
603 new bool:CONFIGURADO[MAX_PLAYERS];
604
605 cache_get_value_name_int(0, "GENERO", PERSONAJE[playerid][p_GENERO]);
606 cache_get_value_name_int(0, "EDAD", PERSONAJE[playerid][p_EDAD]);
607 cache_get_value_name_int(0, "SKIN", PERSONAJE[playerid][p_SKIN]);
608 cache_get_value_name_int(0, "DINERO", PERSONAJE[playerid][p_DINERO]);
609 cache_get_value_name_int(0, "VIRTUALWORLD", PERSONAJE[playerid][p_VIRTUALWORLD]);
610 cache_get_value_name_int(0, "INTERIOR", PERSONAJE[playerid][p_INTERIOR]);
611 cache_get_value_name_float(0, "VIDA", PERSONAJE[playerid][p_VIDA]);
612 cache_get_value_name_float(0, "CHALECO", PERSONAJE[playerid][p_CHALECO]);
613 cache_get_value_name_float(0, "POS_X", PERSONAJE[playerid][p_POS_X]);
614 cache_get_value_name_float(0, "POS_Y", PERSONAJE[playerid][p_POS_Y]);
615 cache_get_value_name_float(0, "POS_Z", PERSONAJE[playerid][p_POS_Z]);
616 cache_get_value_name_float(0, "POS_Z", PERSONAJE[playerid][p_POS_A]);
617 cache_get_value_name_int(0, "CONFIGURADO", CONFIGURADO[playerid]);
618
619 if(!CONFIGURADO[playerid])
620 {
621 ShowPlayerDialog(playerid, DIALOG_GENERO, DIALOG_STYLE_MSGBOX, "Elegir genero:", "Seleccione el genero de su personaje", "Masculino", "Femenino");
622 return 1;
623 }
624 PERSONAJE_CARGADO(playerid);
625 }
626 else
627 {
628 new QUERY[64];
629 mysql_format(DATABASE, QUERY, sizeof(QUERY), "INSERT INTO `personajes` (ID) VALUES (%d);", CUENTA[playerid][c_ID]);
630 mysql_tquery(DATABASE, QUERY);
631 ShowPlayerDialog(playerid, DIALOG_GENERO, DIALOG_STYLE_MSGBOX, "Elegir genero:", "Seleccione el genero de su personaje", "Masculino", "Femenino");
632 }
633 return 1;
634}
635
636public OnPlayerCommandReceived(playerid, cmd[], params[], flags)
637{
638 if(flags)
639 {
640 if(flags > CUENTA[playerid][c_ADMIN])
641 {
642 SendClientMessage(playerid, -1, "No tienes autorización para usar este comando.");
643 return 0;
644 }
645 if(!TEMPORAL[playerid][t_ADMINDUTY])
646 {
647 SendClientMessage(playerid, -1, "Debes estar en servicio administrativo para usar este comando.");
648 return 0;
649 }
650 }
651 return 1;
652}
653
654public OnPlayerCommandPerformed(playerid, cmd[], params[], result, flags)
655{
656 if(result == -1)
657 {
658 SendClientMessage(playerid, -1, "El comando ingresado no existe.");
659 return 0;
660 }
661 return 1;
662}
663
664//5 -> Comandos
665CMD:comandos(playerid)
666{
667 SendClientMessage(playerid, 0x4EA3E1FF, "Comandos disponibles:");
668 SendClientMessage(playerid, 0x4EA3E1FF, "Comandos de rol: {FFFFFF}/me - /do - /s(usurrar) - /g(ritar)");
669 SendClientMessage(playerid, 0x4EA3E1FF, "Comandos OOC: {FFFFFF}/b");
670 SendClientMessage(playerid, 0x4EA3E1FF, "Otros: {FFFFFF}/stats");
671 return 1;
672}
673
674
675CMD:admin(playerid)
676{
677 if(!CUENTA[playerid][c_ADMIN]) return SendClientMessage(playerid, -1, "No tienes autorización para usar este comando.");
678
679 SendClientMessage(playerid, 0x4EA3E1FF, "Comandos administrativos:");
680 SendClientMessage(playerid, 0x4EA3E1FF, "Moderador: {FFFFFF}/a - /limpiarchat - /adminduty - /darskin - /kick");
681 SendClientMessage(playerid, -1, "{FF0000}Administrador: {FFFFFF}/a - /limpiarchat - /adminduty - /darskin - /kick - /dardinero - /daradmin");
682 return 1;
683}
684
685
686CMD:a(playerid, params[])
687{
688 if(!CUENTA[playerid][c_ADMIN]) return SendClientMessage(playerid, -1, "No tienes autorización para usar este comando.");
689
690 if(sscanf(params, "s[128]", params[0])) return SendClientMessage(playerid, -1, "Sintaxis: '/A [Texto]'");
691
692 new STRING[128];
693 format(STRING, sizeof(STRING), "[ADMINS] %s %s: %s", RANGOS_ADMINISTRATIVOS[CUENTA[playerid][c_ADMIN]], NOMBRE_ROLEPLAY(playerid), params[0]);
694 for(new i; i <= GetPlayerPoolSize(); i++)
695 {
696 if(IsPlayerConnected(i))
697 {
698 if(CUENTA[i][c_ADMIN])
699 {
700 SendClientMessage(i, 0x4EA3E1FF, STRING);
701 }
702 }
703 }
704 return 1;
705}
706
707CMD:limpiarchat(playerid)
708{
709 for(new i; i < 32; i++) SendClientMessageToAll(-1, " ");
710
711 new STRING[128];
712 format(STRING, sizeof(STRING), "El %s %s ha limpiado el log del chat", RANGOS_ADMINISTRATIVOS[CUENTA[playerid][c_ADMIN]], NOMBRE_ROLEPLAY(playerid));
713 SendClientMessageToAll(0x4EA3E1FF, STRING);
714 return 1;
715}
716
717CMD:darmeadmin(playerid) //Comando para darse admin ... (Usted puede cambiarlo a su gusto)
718{
719 CUENTA[playerid][c_ADMIN] = sizeof(RANGOS_ADMINISTRATIVOS) - 1;
720
721 new QUERY[100];
722 mysql_format(DATABASE, QUERY, sizeof(QUERY), "UPDATE `cuentas` SET `ADMIN` = %d WHERE `ID` = %d;", CUENTA[playerid][c_ADMIN], CUENTA[playerid][c_ID]);
723 mysql_tquery(DATABASE, QUERY);
724
725 SendClientMessage(playerid, -1, "Ahora eres Dios");
726 return 1;
727}
728
729CMD:daradmin(playerid, params[])
730{
731 new PLAYER, RANGO, QUERY[120], STRING[128];
732
733 if(sscanf(params, "ui", PLAYER, RANGO)) return SendClientMessage(playerid, -1, "Sintaxis: '/Daradmin [ID Jugador] [Rango]'");
734 if(!IsPlayerConnected(PLAYER)) return SendClientMessage(playerid, -1, "Jugador desconectado");
735 if(RANGO > sizeof(RANGOS_ADMINISTRATIVOS)) return SendClientMessage(playerid, -1, "Rango inválido");
736
737 if(RANGO == 0)
738 {
739 format(STRING, sizeof(STRING), "%s ha expulsado del equipo administrativo a %s", NOMBRE_ROLEPLAY(playerid), NOMBRE_ROLEPLAY(PLAYER));
740 SendClientMessageToAll(0x4EA3E1FF, STRING);
741 CUENTA[PLAYER][c_ADMIN] = 0;
742 mysql_format(DATABASE, QUERY, sizeof(QUERY), "UPDATE `cuentas` SET `ADMIN` = 0 WHERE `ID` = %d;", CUENTA[PLAYER][c_ID]);
743 mysql_tquery(DATABASE, QUERY);
744 return 1;
745 }
746
747 format(STRING, sizeof(STRING), "%s ha establecido el rango administrativo de %s a %s", NOMBRE_ROLEPLAY(playerid), NOMBRE_ROLEPLAY(PLAYER), RANGOS_ADMINISTRATIVOS[RANGO]);
748 SendClientMessageToAll(0x4EA3E1FF, STRING);
749
750 CUENTA[PLAYER][c_ADMIN] = RANGO;
751
752 mysql_format(DATABASE, QUERY, sizeof(QUERY), "UPDATE `cuentas` SET `ADMIN` = %d WHERE `ID` = %d;", CUENTA[playerid][c_ID], CUENTA[PLAYER][c_ADMIN]);
753 mysql_tquery(DATABASE, QUERY);
754 return 1;
755}
756
757CMD:adminduty(playerid)
758{
759 if(!CUENTA[playerid][c_ADMIN]) return SendClientMessage(playerid, -1, "No tienes autorización para usar este comando.");
760
761 TEMPORAL[playerid][t_ADMINDUTY] = ( (TEMPORAL[playerid][t_ADMINDUTY] == true) ? (false) : (true) );
762
763 new STRING[128];
764 format(STRING, sizeof(STRING), "El %s %s ahora está %s servicio", RANGOS_ADMINISTRATIVOS[CUENTA[playerid][c_ADMIN]], NOMBRE_ROLEPLAY(playerid), ( (TEMPORAL[playerid][t_ADMINDUTY] == true) ? ("en") : ("fuera de") ));
765 SendClientMessageToAll(0x4EA3E1FF, STRING);
766 return 1;
767}
768
769CMD:darskin(playerid, params[])
770{
771 new SKIN, PLAYER;
772 if(sscanf(params, "ui", PLAYER, SKIN)) return SendClientMessage(playerid, -1, "Sintaxis: '/Darskin [ID Jugador] [Skin ID]'");
773 if(!IsPlayerConnected(PLAYER)) return SendClientMessage(playerid, -1, "Jugador desconectado");
774 if(SKIN < 1 || SKIN > 311) return SendClientMessage(playerid, -1, "El Skin debe ser entre 1 y 311");
775
776 new STRING[100];
777 format(STRING, sizeof(STRING), "%s ha establecido el skin ID %d a %s", NOMBRE_ROLEPLAY(playerid), SKIN, NOMBRE_ROLEPLAY(PLAYER));
778 SendClientMessageToAll(0x4EA3E1FF, STRING);
779
780 PERSONAJE[PLAYER][p_SKIN] = SKIN;
781 SetPlayerSkin(PLAYER, PERSONAJE[PLAYER][p_SKIN]);
782
783 new QUERY[64];
784 mysql_format(DATABASE, QUERY, sizeof(QUERY), "UPDATE `personajes` SET `SKIN` = %d WHERE `ID` = %d;", PERSONAJE[PLAYER][p_SKIN], CUENTA[PLAYER][c_ID]);
785 mysql_tquery(DATABASE, QUERY);
786 return 1;
787}
788
789CMD:dardinero(playerid, params[])
790{
791 new DINERO, PLAYER;
792 if(sscanf(params, "ui", PLAYER, DINERO)) return SendClientMessage(playerid, -1, "Sintaxis: '/Dardinero [ID Jugador] [Cantidad]'");
793 if(!IsPlayerConnected(PLAYER)) return SendClientMessage(playerid, -1, "Jugador desconectado");
794 if(DINERO < 1 || DINERO > 99999999) return SendClientMessage(playerid, -1, "Sólo puedes dar una cantidad entre 1$ y 99999999$");
795
796
797 PERSONAJE[playerid][p_DINERO] += DINERO;
798
799 if(PERSONAJE[playerid][p_DINERO] > 99999999) PERSONAJE[playerid][p_DINERO] = 99999999;
800
801 ResetPlayerMoney(playerid);
802 GivePlayerMoney(playerid, PERSONAJE[playerid][p_DINERO]);
803
804 new STRING[100];
805 format(STRING, sizeof(STRING), "El %s %s ha dado %d$ a %s", RANGOS_ADMINISTRATIVOS[CUENTA[playerid][c_ADMIN]], NOMBRE_ROLEPLAY(playerid), DINERO, NOMBRE_ROLEPLAY(PLAYER));
806 SendClientMessageToAll(-1, STRING);
807
808
809 new QUERY[100];
810 mysql_format(DATABASE, QUERY, sizeof(QUERY), "UPDATE `personajes` SET `DINERO` = %d WHERE `ID` = %d;", PERSONAJE[playerid][p_DINERO], CUENTA[PLAYER][c_ID]);
811 mysql_tquery(DATABASE, QUERY);
812 return 1;
813}
814
815CMD:kick(playerid, params[])
816{
817 new PLAYER, RAZON[32];
818 if(sscanf(params, "us[32]", PLAYER, RAZON)) return SendClientMessage(playerid, -1, "Sintaxis: '/Kick [ID Jugador] [Razón (32 carácteres máximo)]'");
819 if(!IsPlayerConnected(PLAYER)) return SendClientMessage(playerid, -1, "Jugador desconectado");
820 if(strlen(RAZON) < 10 || strlen(RAZON) > 32) return SendClientMessage(playerid, -1, "La razón de la expulsión debe contener entre 10 y 32 carácteres");
821
822 new STRING[128];
823 format(STRING, sizeof(STRING), "El %s %s ha expulsado a %s | Razón: %s", RANGOS_ADMINISTRATIVOS[CUENTA[playerid][c_ADMIN]], NOMBRE_ROLEPLAY(playerid), NOMBRE_ROLEPLAY(PLAYER), RAZON);
824 SendClientMessageToAll(0x4EA3E1FF, STRING);
825
826 SendClientMessage(PLAYER, 0xFF0000FF, "Has sido expulsado del servidor");
827 KICK(PLAYER);
828 return 1;
829}
830
831new TIEMPO_OOC[MAX_PLAYERS];
832CMD:b(playerid, params[])
833{
834 if(TIEMPO_OOC[playerid] > gettime() ) return SendClientMessage(playerid, -1, "Debes esperar 5 segundos para utilizar este canal nuevamente");
835 if(sscanf(params, "s[128]", params[0])) return SendClientMessage(playerid, -1, "Sintaxis: '/B [Texto]'");
836
837 new STRING[128];
838 format(STRING, sizeof(STRING), "[OOC] %s: (( %s ))", NOMBRE_ROLEPLAY(playerid), params[0]);
839 ProxDetector(30.0, playerid, STRING, 0xF0F0F0F0, 0xF0F0F0F0, 0xF0F0F0F0, 0xF0F0F0F0, 0xF0F0F0F0);
840 TIEMPO_OOC[playerid] = gettime() + 5;
841 return 1;
842}
843
844CMD:g(playerid, params[])
845{
846 if(sscanf(params, "s[128]", params[0])) return SendClientMessage(playerid, -1, "Sintaxis: '/G(ritar) [Texto]'");
847
848 new STRING[128];
849 format(STRING, sizeof(STRING), "%s grita: ¡¡%s!!", NOMBRE_ROLEPLAY(playerid), params[0]);
850 ProxDetector(50.0, playerid, STRING, -1, -1, -1, -1, -1);
851 return 1;
852}
853
854CMD:s(playerid, params[])
855{
856 if(sscanf(params, "s[128]", params[0])) return SendClientMessage(playerid, -1, "Sintaxis: '/S(usurrar) [Texto]'");
857
858 new STRING[128];
859 format(STRING, sizeof(STRING), "%s susurra: %s", NOMBRE_ROLEPLAY(playerid), params[0]);
860 ProxDetector(5.0, playerid, STRING, -1, -1, -1, -1, -1);
861 return 1;
862}
863
864CMD:me(playerid, params[])
865{
866 if(sscanf(params, "s[128]", params[0])) return SendClientMessage(playerid, -1, "Sintaxis: '/Me [Texto]'");
867
868 new STRING[128];
869 format(STRING, sizeof(STRING), "%s %s", NOMBRE_ROLEPLAY(playerid), params[0]);
870 ProxDetector(30.0, playerid, STRING, 0xCF00D9FF, 0xCF00D9FF, 0xCF00D9FF, 0xCF00D9FF, 0xCF00D9FF);
871 return 1;
872}
873
874CMD:do(playerid, params[])
875{
876 if(sscanf(params, "s[128]", params[0])) return SendClientMessage(playerid, -1, "Sintaxis: '/Do [Texto]'");
877
878 new STRING[128];
879 format(STRING, sizeof(STRING), "* [%d] %s.", playerid, params[0]);
880 ProxDetector(30.0, playerid, STRING, 0xB6DB22FF, 0xB6DB22FF, 0xB6DB22FF, 0xB6DB22FF, 0xB6DB22FF);
881 return 1;
882}
883
884CMD:stats(playerid)
885{
886 new STRING[128];
887 SendClientMessage(playerid, 0x00CC00FF, "Estadisticas de tu personaje:");
888 format(STRING, sizeof(STRING), "ID SQL: %d | Genero: %s | Edad: %d años | Skin: %d | Dinero: %d$ | Vida: %.2f | Chaleco: %.2f",
889 CUENTA[playerid][c_ID],
890 ((PERSONAJE[playerid][p_GENERO] == 1) ? ("Masculino"):("Femenino")),
891 PERSONAJE[playerid][p_EDAD],
892 PERSONAJE[playerid][p_SKIN],
893 PERSONAJE[playerid][p_DINERO],
894 PERSONAJE[playerid][p_VIDA],
895 PERSONAJE[playerid][p_CHALECO]);
896 SendClientMessage(playerid, -1, STRING);
897 return 1;
898}
899
900//6 -> Flags
901flags:limpiarchat(CMD_MODERADOR);
902flags:darskin(CMD_MODERADOR);
903flags:kick(CMD_MODERADOR);
904flags:daradmin(CMD_ADMINISTRADOR);
905flags:dardinero(CMD_ADMINISTRADOR);