· 8 years ago · Jun 08, 2018, 10:30 PM
1// GameMode Base por I'm Andres (ImAndres, SoyAndrés) editada por Eduardo_1 ($moke)
2#include <a_samp>
3#undef MAX_PLAYERS
4#define MAX_PLAYERS 101 //Cambiar por los slots de tu servidor.
5#include <YSI\y_timers> //Versión 4
6#include <zcmd>
7#include <streamer> //Versión 2.9.3
8#include <sscanf2> //Versión 2.8.2
9//Macros y natives
10native IsValidVehicle(vehicleid);
11native WP_Hash(buffer[], len, const str[]);
12//
13#define COLOR_USO 0xFFC300FF
14#define COLOR_ERROR 0xB50618FF
15//
16enum datos@jugador
17{
18 pID,
19 pNacionalidad[40],
20 pAcento[15],
21 pRopa,
22 pEdad,
23 pSexo,
24 Float:pPosX,
25 Float:pPosY,
26 Float:pPosZ,
27 Float:pPosA,
28 Float:pVida,
29 Float:pChaleco,
30 //Temporales
31 Intentos,
32 bool:Logeado
33}
34new pInfo[MAX_PLAYERS][datos@jugador];
35//
36new DB:BaseRP;
37//
38#define DIALOGO_REGISTRO 1 //+4
39#define DIALOGO_INGRESO 6
40//
41main()
42{
43}
44
45new bool:MotorAuto[MAX_VEHICLES];
46
47public OnGameModeInit()
48{
49 BaseRP = db_open("BaseRP.db");
50 //
51 db_query(BaseRP, "CREATE TABLE IF NOT EXISTS Usuarios (pID INTEGER PRIMARY KEY AUTOINCREMENT, pNick VARCHAR(24) COLLATE NOCASE, pClave VARCHAR(129) NOT NULL, pNacionalidad VARCHAR(40) DEFAULT 'Venezuela', pAcento VARCHAR(15) DEFAULT 'Venezolano', pRopa INT DEFAULT 0, pEdad INT DEFAULT 17, pSexo INT DEFAULT 1, pPosX FLOAT DEFAULT 1481.1447, pPosY FLOAT DEFAULT -1742.8448, pPosZ FLOAT DEFAULT 13.5469, pPosA FLOAT DEFAULT 0.0, pVida FLOAT DEFAULT 100.0, pChaleco FLOAT DEFAULT 0.0)");
52 //
53 CreateDynamic3DTextLabel("{005FFF}Bienvenido\n{FFFFFF}esperamos que sea de su agrado el servidor\nPuede añadir nuestra {005FFF}IP {FFFFFF}a favoritos. ", 0x0064FFFF, 1153.8743,-1772.0077,16.5992, 20.0); //MENSAJE AL SPAWNEAR
54 for(new v = 0, vj = MAX_VEHICLES; v < vj; v++)
55 {
56 MotorAuto[v] = false;
57 new motor, luces, alarma, puertas, capo, maletero, objetivo;
58 GetVehicleParamsEx(v, motor, luces, alarma, puertas, capo, maletero, objetivo);
59 SetVehicleParamsEx(v, true, luces, alarma, puertas, capo, maletero, objetivo);
60 }
61 /* Funciones Básicas para RP */
62 LimitPlayerMarkerRadius(20.0);
63 DisableInteriorEnterExits();
64 EnableStuntBonusForAll(0);
65 ShowNameTags(1);
66 UsePlayerPedAnims();
67 SendRconCommand("password 0"); //Remueve la contraseña del servidor al iniciar el modo de juego
68 SetGameModeText("Base RolePlay v0.2");
69 SendRconCommand("hostname » [BR] Base RolePlay en español");
70 AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
71 //
72 foreach(new i : Player) if(IsPlayerConnected(i))
73 {
74 OnPlayerConnect(i);
75 }
76 return 1;
77}
78
79public OnGameModeExit()
80{
81 for(new v = 0, vj = MAX_VEHICLES; v < vj; v++) if(IsValidVehicle(v))
82 {
83 DestroyVehicle(v);
84 }
85 db_close(BaseRP);
86 return 1;
87}
88
89public OnPlayerRequestClass(playerid, classid)
90{
91 SetPlayerCameraPos(playerid, 1890.1014,-1194.7969,25.8091);
92 SetPlayerCameraLookAt(playerid, 1933.4393,-1196.2479,18.8163);
93 return 1;
94}
95
96public OnPlayerConnect(playerid)
97{
98 R_Datos(playerid);
99 if(!EsNombreRP(NombrePlayer(playerid, 0)))
100 {
101 KickEx(playerid, "Nombre inválido (Formato: Nombre_Apellido)");
102 return 1;
103 }
104 SetPlayerColor(playerid, 0x555555BB);
105 //
106 new c_q[66], DBResult:c_r;
107 format(c_q, sizeof(c_q), "SELECT pID FROM Usuarios WHERE pNick = '%q'", NombrePlayer(playerid, 0));
108 c_r = db_query(BaseRP, c_q);
109 if(db_num_rows(c_r))
110 {
111 ShowPlayerDialogEx(playerid, DIALOGO_INGRESO, DIALOG_STYLE_PASSWORD, "{FFC300}Base RolePlay {FFFFFF}- {FFC300}Iniciar sesión", "{FFFFFF}La cuenta \"{FFC300}%s\" {FFFFFF}está registrada, para poder usarla debes escribir la contraseña\n\n{FFC300}NOTA: {FFFFFF}Si no es tu cuenta, salte e ingresa con otro nombre", "Ingresar", "Salir", NombrePlayer(playerid, 0));
112 }
113 else
114 {
115 ShowPlayerDialogEx(playerid, DIALOGO_REGISTRO+1, DIALOG_STYLE_INPUT, "{FFC300}Base RolePlay {FFFFFF}- {FFC300}Registro (Edad)", "{FFFFFF}La cuenta \"{FFC300}%s\" {FFFFFF}no está registrada, para poder usarla debes registrarla.\n\n{FFC300}Paso #1: {FFFFFF}Debes escribir tu edad (MÃnimo 17 - Máximo 70)", "Siguiente", "Salir", NombrePlayer(playerid, 0));
116 }
117 db_free_result(c_r);
118 return 1;
119}
120
121public OnPlayerDisconnect(playerid, reason)
122{
123 G_Datos(playerid);
124 return 1;
125}
126
127public OnPlayerSpawn(playerid)
128{
129 SetPlayerPos(playerid, pInfo[playerid][pPosX], pInfo[playerid][pPosY], pInfo[playerid][pPosZ]);
130 SetPlayerFacingAngle(playerid, pInfo[playerid][pPosA]);
131 SetPlayerHealth(playerid, pInfo[playerid][pVida]);
132 SetPlayerArmour(playerid, pInfo[playerid][pChaleco]);
133 SetPlayerSkin(playerid, pInfo[playerid][pRopa]);
134 return 1;
135}
136
137public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
138{
139 switch(dialogid)
140 {
141 case DIALOGO_REGISTRO: //Contraseña
142 {
143 if(!response) return ShowPlayerDialogEx(playerid, DIALOGO_REGISTRO+4, DIALOG_STYLE_INPUT, "{FFC300}Base RolePlay {FFFFFF}- {FFC300}Registro (Acento)", "{FFFFFF}La cuenta \"{FFC300}%s\" {FFFFFF}no está registrada, para poder usarla debes registrarla.\n\n{FFC300}Paso #4: {FFFFFF}Debes especificar tu acento (Ejemplo: Jamaiquino) (5-15)", "Siguiente", "Volver", NombrePlayer(playerid, 0));
144 //
145 if(strlen(inputtext[0]) < 5 || strlen(inputtext[0]) > 25) return ShowPlayerDialogEx(playerid, DIALOGO_REGISTRO, DIALOG_STYLE_PASSWORD, "{FFC300}Base RolePlay {FFFFFF}- {FFC300}Registro", "{FFFFFF}La cuenta \"{FFC300}%s\" {FFFFFF}no está registrada, para poder usarla debes registrarla escribiendo una contraseña\n\n{FFC300}Paso#5: {FFFFFF}Debes escribir la contraseña (5-25)\n{FFC300}NOTA: {FFFFFF}Si pierdes la contraseña perderás la cuenta", "Registrar", "Volver", NombrePlayer(playerid, 0));
146 //
147 new buf[129], r_q[350];
148 WP_Hash(buf, sizeof(buf), inputtext);
149 format(r_q, sizeof(r_q), "INSERT INTO Usuarios (pNick, pClave, pNacionalidad, pAcento, pRopa, pEdad, pSexo) VALUES ('%q', '%s', '%q', '%q', %d, %d, %d)", NombrePlayer(playerid, 0), buf, pInfo[playerid][pNacionalidad], pInfo[playerid][pAcento], pInfo[playerid][pRopa], pInfo[playerid][pEdad], pInfo[playerid][pSexo]);
150 db_query(BaseRP, r_q);
151 //
152 new DBResult:id_r;
153 id_r = db_query(BaseRP, "SELECT last_insert_rowid()");
154 pInfo[playerid][pID] = db_get_field_int(id_r);
155 db_free_result(id_r);
156 //
157 pInfo[playerid][pPosX] = 1481.1447;
158 pInfo[playerid][pPosY] = -1742.8448;
159 pInfo[playerid][pPosZ] = 13.5469;
160 pInfo[playerid][pPosA] = 0.0;
161 pInfo[playerid][pVida] = 100.0;
162 pInfo[playerid][pChaleco] = 0.0;
163 pInfo[playerid][Logeado] = true;
164 //
165 SpawnPlayer(playerid);
166 }
167 case DIALOGO_REGISTRO+1: //Edad
168 {
169 if(!response) return KickEx(playerid, "Evitar registro");
170 //
171 if(strval(inputtext[0]) < 17 || strval(inputtext[0]) > 70) return ShowPlayerDialogEx(playerid, DIALOGO_REGISTRO+1, DIALOG_STYLE_INPUT, "{FFC300}Base RolePlay {FFFFFF}- {FFC300}Registro (Edad)", "{FFFFFF}La cuenta \"{FFC300}%s\" {FFFFFF}no está registrada, para poder usarla debes registrarla.\n\n{FFC300}Paso #1: {FFFFFF}Debes escribir tu edad (MÃnimo 17 - Máximo 70)", "Siguiente", "Salir", NombrePlayer(playerid, 0));
172 //
173 pInfo[playerid][pEdad] = strval(inputtext[0]);
174 ShowPlayerDialogEx(playerid, DIALOGO_REGISTRO+2, DIALOG_STYLE_INPUT, "{FFC300}Base RolePlay {FFFFFF}- {FFC300}Registro (Sexo)", "{FFFFFF}La cuenta \"{FFC300}%s\" {FFFFFF}no está registrada, para poder usarla debes registrarla.\n\n{FFC300}Paso #2: {FFFFFF}Debes especificar tu genero (Hombre - Mujer)", "Siguiente", "Volver", NombrePlayer(playerid, 0));
175 }
176 case DIALOGO_REGISTRO+2: //Genero
177 {
178 if(!response) return ShowPlayerDialogEx(playerid, DIALOGO_REGISTRO+1, DIALOG_STYLE_INPUT, "{FFC300}Base RolePlay {FFFFFF}- {FFC300}Registro (Edad)", "{FFFFFF}La cuenta \"{FFC300}%s\" {FFFFFF}no está registrada, para poder usarla debes registrarla.\n\n{FFC300}Paso #1: {FFFFFF}Debes escribir tu edad (MÃnimo 17 - Máximo 70)", "Siguiente", "Salir", NombrePlayer(playerid, 0));
179 //
180 if(!strcmp(inputtext[0], "hombre", true))
181 {
182 pInfo[playerid][pSexo] = 1;
183 switch(random(4))
184 {
185 case 0: pInfo[playerid][pRopa] = 14;
186 case 1: pInfo[playerid][pRopa] = 21;
187 case 2: pInfo[playerid][pRopa] = 22;
188 case 3: pInfo[playerid][pRopa] = 43;
189 }
190 ShowPlayerDialogEx(playerid, DIALOGO_REGISTRO+3, DIALOG_STYLE_INPUT, "{FFC300}Base RolePlay {FFFFFF}- {FFC300}Registro (PaÃs)", "{FFFFFF}La cuenta \"{FFC300}%s\" {FFFFFF}no está registrada, para poder usarla debes registrarla.\n\n{FFC300}Paso #3: {FFFFFF}Debes escribir tu paÃs de nacimiento (5-40)", "Siguiente", "Volver", NombrePlayer(playerid, 0));
191 }
192 else if(!strcmp(inputtext[0], "mujer", true))
193 {
194 pInfo[playerid][pSexo] = 2;
195 switch(random(4))
196 {
197 case 0: pInfo[playerid][pRopa] = 9;
198 case 1: pInfo[playerid][pRopa] = 38;
199 case 2: pInfo[playerid][pRopa] = 40;
200 case 3: pInfo[playerid][pRopa] = 41;
201 }
202 ShowPlayerDialogEx(playerid, DIALOGO_REGISTRO+3, DIALOG_STYLE_INPUT, "{FFC300}Base RolePlay {FFFFFF}- {FFC300}Registro (PaÃs)", "{FFFFFF}La cuenta \"{FFC300}%s\" {FFFFFF}no está registrada, para poder usarla debes registrarla.\n\n{FFC300}Paso #3: {FFFFFF}Debes escribir tu paÃs de nacimiento (5-40)", "Siguiente", "Volver", NombrePlayer(playerid, 0));
203 }
204 else return ShowPlayerDialogEx(playerid, DIALOGO_REGISTRO+2, DIALOG_STYLE_INPUT, "{FFC300}Base RolePlay {FFFFFF}- {FFC300}Registro (Sexo)", "{FFFFFF}La cuenta \"{FFC300}%s\" {FFFFFF}no está registrada, para poder usarla debes registrarla.\n\n{FFC300}Paso #2: {FFFFFF}Debes especificar tu genero (Hombre - Mujer)", "Siguiente", "Volver", NombrePlayer(playerid, 0));
205 }
206 case DIALOGO_REGISTRO+3: //PaÃs (Nacionalidad)
207 {
208 if(!response) return ShowPlayerDialogEx(playerid, DIALOGO_REGISTRO+2, DIALOG_STYLE_INPUT, "{FFC300}Base RolePlay {FFFFFF}- {FFC300}Registro (Sexo)", "{FFFFFF}La cuenta \"{FFC300}%s\" {FFFFFF}no está registrada, para poder usarla debes registrarla.\n\n{FFC300}Paso #2: {FFFFFF}Debes especificar tu genero (Hombre - Mujer)", "Siguiente", "Volver", NombrePlayer(playerid, 0));
209 //
210 if(strlen(inputtext[0]) < 5 || strlen(inputtext[0]) > 40) return ShowPlayerDialogEx(playerid, DIALOGO_REGISTRO+3, DIALOG_STYLE_INPUT, "{FFC300}Base RolePlay {FFFFFF}- {FFC300}Registro (PaÃs)", "{FFFFFF}La cuenta \"{FFC300}%s\" {FFFFFF}no está registrada, para poder usarla debes registrarla.\n\n{FFC300}Paso #3: {FFFFFF}Debes escribir tu paÃs de nacimiento (5-40)", "Siguiente", "Volver", NombrePlayer(playerid, 0));
211 format(pInfo[playerid][pNacionalidad], 40, "%s", inputtext[0]);
212 ShowPlayerDialogEx(playerid, DIALOGO_REGISTRO+4, DIALOG_STYLE_INPUT, "{FFC300}Base RolePlay {FFFFFF}- {FFC300}Registro (Acento)", "{FFFFFF}La cuenta \"{FFC300}%s\" {FFFFFF}no está registrada, para poder usarla debes registrarla.\n\n{FFC300}Paso #4: {FFFFFF}Debes especificar tu acento (Ejemplo: Jamaiquino) (5-15)", "Siguiente", "Volver", NombrePlayer(playerid, 0));
213 }
214 case DIALOGO_REGISTRO+4: //Acento
215 {
216 if(!response) return ShowPlayerDialogEx(playerid, DIALOGO_REGISTRO+3, DIALOG_STYLE_INPUT, "{FFC300}Base RolePlay {FFFFFF}- {FFC300}Registro (PaÃs)", "{FFFFFF}La cuenta \"{FFC300}%s\" {FFFFFF}no está registrada, para poder usarla debes registrarla.\n\n{FFC300}Paso #3: {FFFFFF}Debes escribir tu paÃs de nacimiento (5-30)", "Siguiente", "Volver", NombrePlayer(playerid, 0));
217 //
218 if(strlen(inputtext[0]) < 5 || strlen(inputtext[0]) > 15) return ShowPlayerDialogEx(playerid, DIALOGO_REGISTRO+4, DIALOG_STYLE_INPUT, "{FFC300}Base RolePlay {FFFFFF}- {FFC300}Registro (Acento)", "{FFFFFF}La cuenta \"{FFC300}%s\" {FFFFFF}no está registrada, para poder usarla debes registrarla.\n\n{FFC300}Paso #4: {FFFFFF}Debes especificar tu acento (Ejemplo: Jamaiquino) (5-15)", "Siguiente", "Volver", NombrePlayer(playerid, 0));
219 format(pInfo[playerid][pAcento], 40, "%s", inputtext[0]);
220 ShowPlayerDialogEx(playerid, DIALOGO_REGISTRO, DIALOG_STYLE_PASSWORD, "{FFC300}Base RolePlay {FFFFFF}- {FFC300}Registro", "{FFFFFF}La cuenta \"{FFC300}%s\" {FFFFFF}no está registrada, para poder usarla debes registrarla escribiendo una contraseña\n\n{FFC300}Paso#5: {FFFFFF}Debes escribir la contraseña (5-25)\n{FFC300}NOTA: {FFFFFF}Si pierdes la contraseña perderás la cuenta", "Registrar", "Volver", NombrePlayer(playerid, 0));
221 }
222 case DIALOGO_INGRESO:
223 {
224 new DBResult:i_r, i_c[210], buf[129];
225 WP_Hash(buf, sizeof(buf), inputtext);
226 format(i_c, sizeof(i_c), "SELECT * FROM Usuarios WHERE pNick = '%q' AND pClave = '%s'", NombrePlayer(playerid, 0), buf);
227 i_r = db_query(BaseRP, i_c);
228 if(db_num_rows(i_r))
229 {
230 pInfo[playerid][pID] = db_get_field_assoc_int(i_r, "pID");
231 pInfo[playerid][pRopa] = db_get_field_assoc_int(i_r, "pRopa");
232 pInfo[playerid][pEdad] = db_get_field_assoc_int(i_r, "pEdad");
233 pInfo[playerid][pSexo] = db_get_field_assoc_int(i_r, "pSexo");
234 //
235 db_get_field_assoc(i_r, "pNacionalidad", pInfo[playerid][pNacionalidad], 30);
236 db_get_field_assoc(i_r, "pAcento", pInfo[playerid][pAcento], 15);
237 //
238 pInfo[playerid][pPosX] = db_get_field_assoc_float(i_r, "pPosX");
239 pInfo[playerid][pPosY] = db_get_field_assoc_float(i_r, "pPosY");
240 pInfo[playerid][pPosZ] = db_get_field_assoc_float(i_r, "pPosZ");
241 pInfo[playerid][pPosA] = db_get_field_assoc_float(i_r, "pPosA");
242 pInfo[playerid][pVida] = db_get_field_assoc_float(i_r, "pVida");
243 pInfo[playerid][pChaleco] = db_get_field_assoc_float(i_r, "pChaleco");
244 //
245 pInfo[playerid][Logeado] = true;
246 SpawnPlayer(playerid);
247 }
248 else
249 {
250 if(pInfo[playerid][Intentos] < 2)
251 {
252 pInfo[playerid][Intentos]++;
253 ShowPlayerDialogEx(playerid, DIALOGO_INGRESO, DIALOG_STYLE_PASSWORD, "{FFC300}Base RolePlay {FFFFFF}- {FFC300}Iniciar sesión", "{FFFFFF}La cuenta \"{FFC300}%s\" {FFFFFF}está registrada, para poder usarla debes escribir la contraseña\n\n{FFC300}NOTA: {FFFFFF}Si no es tu cuenta, salte e ingresa con otro nombre\n{FFC300}Intentos: {FFFFFF}%d/3", "Ingresar", "Salir", NombrePlayer(playerid, 0), pInfo[playerid][Intentos]);
254 }
255 else
256 {
257 KickEx(playerid, "Contraseña incorrecta (3/3)");
258 }
259 }
260 db_free_result(i_r);
261 }
262 }
263 return 1;
264}
265
266public OnPlayerText(playerid, text[]) //Comando después del * BY: HERMES (Uso: escribes algo en el chat ejemplo - hola como estas *dice mirando al sujeto*)
267{
268 if(strlen(text) < 2 || strlen(text) > 128)
269 {
270 SendClientMessage(playerid, COLOR_ERROR, "Error: Texto muy corto o muy largo.");
271 return 0;
272 }
273 new texto[180], caracter;
274 strcat(texto, text);
275 new bool:ColocarBlanco = false;
276 while(texto[caracter])
277 {
278 if(texto[caracter] == '*' && texto[caracter+1] != '*')
279 {
280 if(ColocarBlanco == false)
281 {
282 strdel(texto,caracter,caracter+1);
283 strins(texto,"{C2A2DA}",caracter); //{FF64FF}
284 ColocarBlanco = true;
285 } else {
286 strdel(texto,caracter,caracter+1);
287 strins(texto,"{FFFFFF}",caracter);
288 ColocarBlanco = false;
289 }
290 }
291 caracter++;
292 }
293 DetectorCercaniaEx(playerid, 10.0, "%s dice con acento %s: %s", 0xE6E6E6E6,0xC8C8C8C8,0xAAAAAAAA,0x8C8C8C8C,0x6E6E6E6E, NombrePlayer(playerid), pInfo[playerid][pAcento], texto);
294 SetPlayerChatBubble(playerid, text, -1, 7.0, 10000);
295 return 0;
296}
297
298//Comandos de rol
299CMD:s(playerid, params[]) return cmd_susurrar(playerid, params);
300CMD:susurrar(playerid, params[])
301{
302 new s_msg[128];
303 if(sscanf(params, "s[128]", s_msg)) return SendClientMessage(playerid, COLOR_USO, "Usa: /(s)usurrar [texto(2-128)]");
304 if(strlen(s_msg) < 2 || strlen(s_msg) > 128) return SendClientMessage(playerid, COLOR_ERROR, "Error: El texto es muy largo o muy corto.");
305 ///
306 DetectorCercaniaEx(playerid, 5.0, "* %s %s", 0xC2A2DAAA,0xC2A2DAAA,0xC2A2DAAA,0xC2A2DAAA,0xC2A2DAAA, NombrePlayer(playerid), s_msg);
307 return 1;
308}
309//
310CMD:yo(playerid, params[]) return cmd_me(playerid, params);
311CMD:me(playerid, params[])
312{
313 new me_msg[128];
314 if(sscanf(params, "s[128]", me_msg)) return SendClientMessage(playerid, COLOR_USO, "Usa: /yo(me) [texto(2-128)]");
315 if(strlen(me_msg) < 2 || strlen(me_msg) > 128) return SendClientMessage(playerid, COLOR_ERROR, "Error: El texto es muy largo o muy corto.");
316 ///
317 DetectorCercaniaEx(playerid, 20.0, "* %s %s", 0xC2A2DAAA,0xC2A2DAAA,0xC2A2DAAA,0xC2A2DAAA,0xC2A2DAAA, NombrePlayer(playerid), me_msg);
318 return 1;
319}
320//
321CMD:do(playerid, params[])
322{
323 new do_msg[128];
324 if(sscanf(params, "s[128]", do_msg)) return SendClientMessage(playerid, COLOR_USO, "Usa: /do [acción]");
325 if(strlen(do_msg) < 2 || strlen(do_msg) > 128) return SendClientMessage(playerid, COLOR_ERROR, "Error: El texto es muy largo o muy corto.");
326 //
327 DetectorCercaniaEx(playerid, 20.0, "* %s (( %s ))", 0xB6DB22FF,0xB6DB22FF,0xB6DB22FF,0xB6DB22FF,0xB6DB22FF, NombrePlayer(playerid), do_msg);
328 return 1;
329}
330//
331CMD:intentar(playerid, params[])
332{
333 new i_msg[128];
334 if(sscanf(params, "s[128]", i_msg)) return SendClientMessage(playerid, COLOR_USO, "Usa: /intentar [acción]");
335 if(strlen(i_msg) < 2 || strlen(i_msg) > 128) return SendClientMessage(playerid, COLOR_ERROR, "Error: El texto es muy largo o muy corto.");
336 //
337 DetectorCercaniaEx(playerid, 8.0, ( (random(50) < 25) ? ("* %s intenta %s y lo logra.") : ("* %s intenta %s, pero no lo logra.") ), 0x00FF00FF,0x00FF00FF,0x00FF00FF,0x00FF00FF,0x00FF00FF, NombrePlayer(playerid), i_msg);
338 return 1;
339}
340//
341CMD:g(playerid, params[]) return cmd_gritar(playerid, params);
342CMD:gritar(playerid, params[])
343{
344 new g_msg[128];
345 if(sscanf(params, "s[128]", g_msg)) return SendClientMessage(playerid, COLOR_USO, "Usa: /(g)ritar [texto(2-128)]");
346 if(strlen(g_msg) < 2 || strlen(g_msg) > 128) return SendClientMessage(playerid, COLOR_ERROR, "Error: El texto es muy largo o muy corto.");
347 //
348 if(!IsPlayerInAnyVehicle(playerid))
349 ApplyAnimation(playerid, "ON_LOOKERS", "shout_01", 4.1, 0, 1, 1, 1, 1, 1);
350 //
351 DetectorCercaniaEx(playerid, 20.0, "%s grita: %s!", 0xE6E6E6E6,0xC8C8C8C8,0xAAAAAAAA,0x8C8C8C8C,0x6E6E6E6E, g_msg);
352 return 1;
353}
354//
355CMD:d(playerid, params[]) return cmd_decir(playerid, params);
356CMD:decir(playerid, params[])
357{
358 new d_msg[128];
359 if(sscanf(params, "s[128]", d_msg)) return SendClientMessage(playerid, COLOR_USO, "Usa: /(d)ecir [texto(2-128)]");
360 if(strlen(d_msg) < 2 || strlen(d_msg) > 128) return SendClientMessage(playerid, COLOR_ERROR, "Error: El texto es muy largo o muy corto.");
361 //
362 DetectorCercaniaEx(playerid, 20.0, "(( %s dice: %s ))", -1,-1,-1,-1,-1, NombrePlayer(playerid), d_msg);
363 return 1;
364}
365//
366CMD:motor(playerid, params[])
367{
368 if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER) return SendClientMessage(playerid, -1, "No estas dentro de un vehÃculo.");
369 new motor, luces, alarma, puertas, capo, maletero, objetivo;
370 GetVehicleParamsEx(GetPlayerVehicleID(playerid), motor, luces, alarma, puertas, capo, maletero, objetivo);
371 if(MotorAuto[GetPlayerVehicleID(playerid)] == true) //Encendido
372 {
373 SetVehicleParamsEx(GetPlayerVehicleID(playerid), true, luces, alarma, puertas, capo, maletero, objetivo);
374 GameTextForPlayer(playerid, "~w~Motor ~r~apagado~w~.", 3500, 3);
375 }
376 else //Apagado
377 {
378 SetVehicleParamsEx(GetPlayerVehicleID(playerid), false, luces, alarma, puertas, capo, maletero, objetivo);
379 GameTextForPlayer(playerid, "~w~Motor ~g~encendido~w~.", 3500, 3);
380 }
381 return 1;
382}
383
384public OnPlayerStateChange(playerid, newstate, oldstate)
385{
386 if(newstate == PLAYER_STATE_DRIVER && oldstate == PLAYER_STATE_ONFOOT)
387 {
388 SendClientMessage(playerid, -1, "* Para encender o apagar tu vehÃculo usa: /motor");
389 }
390 return 1;
391}
392
393public OnPlayerCommandPerformed(playerid, cmdtext[], success)
394{
395 if(!success)
396 {
397 SendClientMessageEx(playerid, -1, "Este comando ({FFFF28}%s{FFFFFF}) no existe, para más información usa: {FFFF28}/ayuda {FFFFFF}o {FFFF28}/comandos", cmdtext);
398 }
399 return 1;
400}
401//Funciones
402R_Datos(playerid)
403{
404 for(new i; i < _:datos@jugador; ++i)
405 {
406 pInfo[playerid][datos@jugador:i] = 0;
407 }
408 pInfo[playerid][Logeado] = false;
409}
410G_Datos(playerid)
411{
412 GetPlayerPos(playerid, pInfo[playerid][pPosX], pInfo[playerid][pPosY], pInfo[playerid][pPosZ]);
413 GetPlayerFacingAngle(playerid, pInfo[playerid][pPosA]);
414 GetPlayerHealth(playerid, pInfo[playerid][pVida]);
415 GetPlayerArmour(playerid, pInfo[playerid][pChaleco]);
416 new g_q[350];
417 format(g_q, sizeof(g_q), "UPDATE Usuarios SET pNacionalidad = '%q', pAcento = '%q', pRopa = %d, pEdad = %d, pSexo = %d, pPosX = '%f', pPosY = '%f', pPosZ = '%f', pPosA = '%f', pVida = '%f', pChaleco = '%f' WHERE pID = %d",
418 pInfo[playerid][pNacionalidad], pInfo[playerid][pAcento], pInfo[playerid][pRopa], pInfo[playerid][pEdad], pInfo[playerid][pSexo], pInfo[playerid][pPosX], pInfo[playerid][pPosY], pInfo[playerid][pPosZ], pInfo[playerid][pPosA], pInfo[playerid][pVida], pInfo[playerid][pChaleco], pInfo[playerid][pID]);
419 db_query(BaseRP, g_q);
420}
421KickEx(playerid, razon[])
422{
423 if(strlen(razon) > 0)
424 SendClientMessageEx(playerid, COLOR_ERROR, "Has sido expulsado del servidor (Razón: %s)", razon);
425 defer Expulsar(playerid);
426 return 1;
427}
428
429timer Expulsar[500](playerid)
430{
431 Kick(playerid);
432 return 0;
433}
434ShowPlayerDialogEx(playerid, dialogo, estilo, cabezera[64], const fmat[], boton1[], boton2[], va_args<>) //La cabezera (o header, caption) lo limitamos a 64 ya que es el limite wiki.sa-mp.com/wiki/Limits
435{
436 new d_str[2096]; //Limite del "Info (Main text)" wiki.sa-mp.com/wiki/Limits
437 va_format(d_str, sizeof(d_str), fmat, va_start<7>);
438 return ShowPlayerDialog(playerid, dialogo, estilo, cabezera, d_str, boton1, boton2);
439}
440SendClientMessageEx(playerid, color, const fmat[], va_args<>)
441{
442 new str[175];
443 va_format(str, sizeof(str), fmat, va_start<3>);
444 return (playerid != -1) ? (SendClientMessage(playerid, color, str) ) : (SendClientMessageToAll(color, str) );
445}
446NombrePlayer(playerid, rp = 1) //Uno muestra el nombre RolePlay y cualquier otro número muestra el nombre normal
447{
448 new x_x[24], xx[24]; //x_x sólo porque me gusta Marshmello.
449 GetPlayerName(playerid, xx, 24);
450 format(x_x, sizeof(x_x), "%s", xx);
451 for(new i = 0; i < 24; i++)
452 {
453 if(x_x[i] == '_') x_x[i] = ' ';
454 }
455 return (rp == 1) ? (x_x) : (xx);
456}
457EsNombreRP(const nombre[])
458{
459 new numero_barras;
460 for (new i, j = strlen(nombre); i != j; i++)
461 {
462 switch (nombre[i])
463 {
464 case 'A' .. 'Z', 'a' .. 'z': continue;
465 case '_': numero_barras++;
466 default: return 0;
467 }
468 }
469 return numero_barras == 1;
470}
471DetectorCercaniaEx(playerid, Float:dr, const fmat[], color1, color2, color3, color4, color5, va_args<>)
472{
473 new str[175];
474 va_format(str, sizeof(str), fmat, va_start<8>);
475 return DetectorCercania(dr, playerid, str, color1, color2, color3, color4, color5);
476}
477DetectorCercania(Float:DistaciaRadio, playerid, stringg[],coll1,coll2,coll3,coll4,coll5)
478{
479 if(IsPlayerConnected(playerid))
480 {
481 new Float:posx, Float:posy, Float:posz;
482 new Float:oldposx, Float:oldposy, Float:oldposz;
483 new Float:tempposx, Float:tempposy, Float:tempposz;
484 GetPlayerPos(playerid, oldposx, oldposy, oldposz);
485 for(new i = 0; i < MAX_PLAYERS; i++)
486 {
487 if(IsPlayerConnected(i) && (GetPlayerVirtualWorld(i) == GetPlayerVirtualWorld(playerid)))
488 {
489 GetPlayerPos(i, posx, posy, posz);
490 tempposx = (oldposx -posx);
491 tempposy = (oldposy -posy);
492 tempposz = (oldposz -posz);
493 if (((tempposx < DistaciaRadio/16) && (tempposx > -DistaciaRadio/16)) && ((tempposy < DistaciaRadio/16) && (tempposy > -DistaciaRadio/16)) && ((tempposz < DistaciaRadio/16) && (tempposz > -DistaciaRadio/16)))
494 SendClientMessage(i, coll1, stringg);
495 else if (((tempposx < DistaciaRadio/8) && (tempposx > -DistaciaRadio/8)) && ((tempposy < DistaciaRadio/8) && (tempposy > -DistaciaRadio/8)) && ((tempposz < DistaciaRadio/8) && (tempposz > -DistaciaRadio/8)))
496 SendClientMessage(i, coll2, stringg);
497 else if (((tempposx < DistaciaRadio/4) && (tempposx > -DistaciaRadio/4)) && ((tempposy < DistaciaRadio/4) && (tempposy > -DistaciaRadio/4)) && ((tempposz < DistaciaRadio/4) && (tempposz > -DistaciaRadio/4)))
498 SendClientMessage(i, coll3, stringg);
499 else if (((tempposx < DistaciaRadio/2) && (tempposx > -DistaciaRadio/2)) && ((tempposy < DistaciaRadio/2) && (tempposy > -DistaciaRadio/2)) && ((tempposz < DistaciaRadio/2) && (tempposz > -DistaciaRadio/2)))
500 SendClientMessage(i, coll4, stringg);
501 else if (((tempposx < DistaciaRadio) && (tempposx > -DistaciaRadio)) && ((tempposy < DistaciaRadio) && (tempposy > -DistaciaRadio)) && ((tempposz < DistaciaRadio) && (tempposz > -DistaciaRadio)))
502 SendClientMessage(i, coll5, stringg);
503 }
504 }
505 }
506 return 1;
507}