· 5 years ago · Apr 24, 2020, 02:08 AM
1#include <a_samp>
2#include <a_mysql>
3#include <sscanf2>
4#include <zcmd>
5#include <DOF2>
6
7#define function%0(%1) forward %0(%1); public %0(%1)
8
9#define MAX_PASS_LEN 65
10#define SALT_LEN 13
11
12enum //Dialogs
13{
14 DIALOG_LOGIN,
15 DIALOG_REGISTRO
16};
17
18new MySQL:DBConn, host[16], username[MAX_PLAYER_NAME], database[MAX_PLAYER_NAME], pass[16];
19
20enum PLAYER_DATA
21{
22 accid,
23 nome[MAX_PLAYER_NAME],
24 senha[MAX_PASS_LEN],
25 admin,
26 Float:posX,
27 Float:posY,
28 Float:posZ,
29 Float:angulo,
30 Float:health,
31 Float:armor,
32 money,
33 interior,
34 vw,
35 skin,
36 score,
37 ORM:ormid,
38 bool:logado,
39 pSalt[SALT_LEN]
40};
41new PlayerData[MAX_PLAYERS][PLAYER_DATA];
42
43main()
44{
45 print("\n----------------------------------");
46 print(" Blank Gamemode by your name here");
47 print("----------------------------------\n");
48}
49
50public OnGameModeInit()
51{
52 SetGameModeText("Blank Script");
53 LoadMap("maps/favela_objects.txt");
54 DataBaseInit();
55 return 1;
56}
57
58public OnGameModeExit()
59{
60 DOF2_Exit();
61 mysql_close(DBConn);
62 return 1;
63}
64
65public OnPlayerRequestClass(playerid, classid)
66{
67 return 1;
68}
69
70public OnPlayerConnect(playerid)
71{
72 RemoveBuildingFromFile(playerid, "maps/favela_buildings.txt");
73 LoadPlayerData(playerid);
74 return 1;
75}
76
77public OnPlayerDisconnect(playerid, reason)
78{
79 if(PlayerData[playerid][logado] == true)
80 {
81 SavePlayerData(playerid);
82
83 new rsnstr[3][] =
84 {
85 "Timeout/Crash",
86 "Saiu",
87 "Kickado/Banido"
88 };
89 new string[64];
90 format(string, sizeof(string), "%s foi desconectado (%s)", GetPlayerNameEx(playerid), rsnstr[reason]);
91 SendClientMessageToAll(-1, string);
92 }
93
94 orm_destroy(PlayerData[playerid][ormid]);
95 for(new PLAYER_DATA:i; i < PLAYER_DATA; i++)
96 PlayerData[playerid][i] = 0;
97
98 return 1;
99}
100
101public OnPlayerSpawn(playerid)
102{
103 if(PlayerData[playerid][logado] == false)
104 {
105 SetPlayerData(playerid);
106 PlayerData[playerid][logado] = true;
107 }
108 return 1;
109}
110
111public OnPlayerDeath(playerid, killerid, reason)
112{
113 return 1;
114}
115
116public OnVehicleSpawn(vehicleid)
117{
118 return 1;
119}
120
121public OnVehicleDeath(vehicleid, killerid)
122{
123 return 1;
124}
125
126public OnPlayerText(playerid, text[])
127{
128 return 1;
129}
130
131public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
132{
133 return 1;
134}
135
136public OnPlayerExitVehicle(playerid, vehicleid)
137{
138 return 1;
139}
140
141public OnPlayerStateChange(playerid, newstate, oldstate)
142{
143 return 1;
144}
145
146public OnPlayerEnterCheckpoint(playerid)
147{
148 return 1;
149}
150
151public OnPlayerLeaveCheckpoint(playerid)
152{
153 return 1;
154}
155
156public OnPlayerEnterRaceCheckpoint(playerid)
157{
158 return 1;
159}
160
161public OnPlayerLeaveRaceCheckpoint(playerid)
162{
163 return 1;
164}
165
166public OnRconCommand(cmd[])
167{
168 return 1;
169}
170
171public OnPlayerRequestSpawn(playerid)
172{
173 return 1;
174}
175
176public OnObjectMoved(objectid)
177{
178 return 1;
179}
180
181public OnPlayerObjectMoved(playerid, objectid)
182{
183 return 1;
184}
185
186public OnPlayerPickUpPickup(playerid, pickupid)
187{
188 return 1;
189}
190
191public OnVehicleMod(playerid, vehicleid, componentid)
192{
193 return 1;
194}
195
196public OnVehiclePaintjob(playerid, vehicleid, paintjobid)
197{
198 return 1;
199}
200
201public OnVehicleRespray(playerid, vehicleid, color1, color2)
202{
203 return 1;
204}
205
206public OnPlayerSelectedMenuRow(playerid, row)
207{
208 return 1;
209}
210
211public OnPlayerExitedMenu(playerid)
212{
213 return 1;
214}
215
216public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
217{
218 return 1;
219}
220
221public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
222{
223 return 1;
224}
225
226public OnRconLoginAttempt(ip[], password[], success)
227{
228 return 1;
229}
230
231public OnPlayerUpdate(playerid)
232{
233 return 1;
234}
235
236public OnPlayerStreamIn(playerid, forplayerid)
237{
238 return 1;
239}
240
241public OnPlayerStreamOut(playerid, forplayerid)
242{
243 return 1;
244}
245
246public OnVehicleStreamIn(vehicleid, forplayerid)
247{
248 return 1;
249}
250
251public OnVehicleStreamOut(vehicleid, forplayerid)
252{
253 return 1;
254}
255
256public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
257{
258 switch(dialogid)
259 {
260 case DIALOG_LOGIN:
261 {
262 if(!response)
263 Kick(playerid);
264 else
265 {
266 new hash[65];
267 SHA256_PassHash(inputtext, PlayerData[playerid][pSalt], hash, MAX_PASS_LEN);
268 if(strlen(inputtext) < 1 || strcmp(PlayerData[playerid][senha], hash))
269 {
270 SendClientMessage(playerid, -1, "ERRO: Senha incorreta!");
271 ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Login", "Digite sua senha para logar:", "Logar", "Sair");
272 }
273 else
274 {
275 SendClientMessage(playerid, -1, "Logado com sucesso!");
276 SetSpawnInfo(playerid, NO_TEAM, PlayerData[playerid][skin],
277 PlayerData[playerid][posX], PlayerData[playerid][posY],PlayerData[playerid][posZ],
278 PlayerData[playerid][angulo],
279 0, 0, 0, 0, 0, 0);
280 SpawnPlayer(playerid);
281 }
282 }
283 }
284 case DIALOG_REGISTRO:
285 {
286 if(!response)
287 Kick(playerid);
288 else
289 {
290 if(strlen(inputtext) < 1 || strlen(inputtext) > 16)
291 {
292 SendClientMessage(playerid, -1, "ERRO: Sua senha deve conter entre 1 e 16 caracteres!");
293 ShowPlayerDialog(playerid, DIALOG_REGISTRO, DIALOG_STYLE_PASSWORD, "Registro", "Entre com uma senha para se registrar:", "Registrar", "Sair");
294 }
295 else
296 {
297 SendClientMessage(playerid, -1, "Registrado com sucesso!");
298 PlayerData[playerid][pSalt] = Salt();
299 SHA256_PassHash(inputtext, PlayerData[playerid][pSalt], PlayerData[playerid][senha], MAX_PASS_LEN);
300 orm_insert(PlayerData[playerid][ormid]);
301 PlayerData[playerid][logado] = true;
302 SetSpawnInfo(playerid, NO_TEAM, 0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
303 SpawnPlayer(playerid);
304 }
305 }
306 }
307 }
308
309 return 1;
310}
311
312public OnPlayerClickPlayer(playerid, clickedplayerid, source)
313{
314 return 1;
315}
316
317public OnPlayerClickMap(playerid, Float:fX, Float:fY, Float:fZ)
318{
319 return 1;
320}
321
322// FUNCOES
323
324function OnPlayerLogin(playerid)
325{
326 orm_setkey(PlayerData[playerid][ormid], "id");
327
328 if(orm_errno(PlayerData[playerid][ormid]) == ERROR_OK) // jogador ja existe na database
329 ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Login", "Digite sua senha para logar:", "Logar", "Sair");
330 else // jogador não encontrado na database
331 ShowPlayerDialog(playerid, DIALOG_REGISTRO, DIALOG_STYLE_PASSWORD, "Registro", "Entre com uma senha para se registrar:", "Registrar", "Sair");
332 return 1;
333}
334
335function DataBaseInit()
336{
337 //new MYSQL:DBConn, host[16], username[MAX_PLAYER_NAME], database[MAX_PLAYER_NAME], pass[16];
338 LoadDBSettings("dbconfig.ini");
339 DBConn = mysql_connect(host, username, pass, database);
340 if(mysql_errno() == 0)
341 {
342 printf("[MySQL] Database '%s' conectada com sucesso!", database);
343 print("[MySQL] Verificando tabelas...");
344
345 mysql_query(DBConn, "CREATE TABLE IF NOT EXISTS Player (\
346 id int NOT NULL AUTO_INCREMENT,\
347 nome varchar(25) NOT NULL,\
348 senha varchar(65) NOT NULL,\
349 admin int DEFAULT 0,\
350 PRIMARY KEY(id));", false);
351
352 mysql_query(DBConn, "ALTER TABLE Player ADD IF NOT EXISTS health float DEFAULT 100;", false);
353 mysql_query(DBConn, "ALTER TABLE Player ADD IF NOT EXISTS armor float DEFAULT 100;", false);
354 mysql_query(DBConn, "ALTER TABLE Player ADD IF NOT EXISTS dinheiro int DEFAULT 100;", false);
355 mysql_query(DBConn, "ALTER TABLE Player ADD IF NOT EXISTS posX double DEFAULT 0;", false);
356 mysql_query(DBConn, "ALTER TABLE Player ADD IF NOT EXISTS posY double DEFAULT 0;", false);
357 mysql_query(DBConn, "ALTER TABLE Player ADD IF NOT EXISTS posZ double DEFAULT 0;", false);
358 mysql_query(DBConn, "ALTER TABLE Player ADD IF NOT EXISTS angulo double DEFAULT 0;", false);
359 mysql_query(DBConn, "ALTER TABLE Player ADD IF NOT EXISTS interior int DEFAULT 0;", false);
360 mysql_query(DBConn, "ALTER TABLE Player ADD IF NOT EXISTS vw int DEFAULT 0;", false);
361 mysql_query(DBConn, "ALTER TABLE Player ADD IF NOT EXISTS score int DEFAULT 0;", false);
362 mysql_query(DBConn, "ALTER TABLE Player ADD IF NOT EXISTS skin int DEFAULT 0;", false);
363 mysql_query(DBConn, "ALTER TABLE Player ADD IF NOT EXISTS salt varchar(13) NOT NULL;", false);
364
365 print("[MySQL] Tabela 'Players' verificada com sucesso!");
366 }
367 else
368 {
369 printf("[MySQL] ERRO: Não foi possível se conectar a database '%s'!", database);
370 SendRconCommand("exit");
371 }
372
373 return 1;
374}
375
376function RemoveBuildingFromFile(playerid, const file[])
377{
378 new File:map = fopen(file, io_read);
379 if(map)
380 {
381 new string[256];
382 while(fread(map, string))
383 {
384 new modelid, Float:pos[3], Float:rad;
385 if(!sscanf(string, "dffff", modelid, pos[0], pos[1], pos[2], rad))
386 RemoveBuildingForPlayer(playerid, modelid, pos[0], pos[1], pos[2], rad);
387 else
388 return printf("Carregamento do mapa '%s' falhou para o jogador %s(%d).", file, GetPlayerNameEx(playerid), playerid);
389 }
390 }
391 return printf("Jogador %s(%d) carregou o mapa '%s' com êxito.", GetPlayerNameEx(playerid), playerid, file);
392}
393
394function LoadMap(const file[])
395{
396 printf("Carregando Mapa '%s'...", file);
397 new File:map = fopen(file, io_read);
398 if(map)
399 {
400 new string[256];
401 while(fread(map, string))
402 {
403 new modelid, Float:pos[3], Float:rot[3];
404 if(sscanf(string, "dffffff", modelid, pos[0], pos[1], pos[2], rot[0], rot[1], rot[2]))
405 return printf("Erro ao carregar o mapa '%s'!",file);
406 else
407 CreateObject(modelid, pos[0], pos[1], pos[2], rot[0], rot[1], rot[2]);
408
409 }
410 return printf("Mapa '%s' carregado com sucesso!",file);
411 }
412 else return printf("Erro ao carregar o mapa '%s'!",file);
413}
414
415// COMANDOS
416
417CMD:pos(playerid, const params[])
418{
419 new Float:pos[3], giveplayerid;
420 if(sscanf(params, "ufff", giveplayerid, pos[0], pos[1], pos[2]))
421 return SendClientMessage(playerid, -1, "USO: /pos [id] [x] [y] [z]");
422
423 if(!IsPlayerConnected(giveplayerid) || giveplayerid == INVALID_PLAYER_ID)
424 return SendClientMessage(playerid, -1, "ERRO: ID Inválido!");
425
426 SetPlayerPos(giveplayerid, pos[0], pos[1], pos[2]);
427 return 1;
428}
429
430CMD:info(playerid, const params[])
431{
432 new giveplayerid, string[64];
433
434 if(sscanf(params, "u", giveplayerid))
435 return SendClientMessage(playerid, -1, "USO: /info [id]");
436
437 if(!IsPlayerConnected(giveplayerid) || giveplayerid == INVALID_PLAYER_ID)
438 return SendClientMessage(playerid, -1, "ERRO: ID Inválido!");
439
440 format(string, sizeof(string), "Jogador: %s", GetPlayerNameEx(giveplayerid));
441 SendClientMessage(playerid, -1, string);
442
443 format(string, sizeof(string), "ID: %d", giveplayerid);
444 SendClientMessage(playerid, -1, string);
445
446 format(string, sizeof(string), "Score: %d", GetPlayerScore(giveplayerid));
447 SendClientMessage(playerid, -1, string);
448
449 format(string, sizeof(string), "Dinheiro: %d", GetPlayerMoney(giveplayerid));
450 SendClientMessage(playerid, -1, string);
451
452 format(string, sizeof(string), "Life: %f", GetPlayerHealthEx(giveplayerid));
453 SendClientMessage(playerid, -1, string);
454
455 format(string, sizeof(string), "Armor: %f", GetPlayerArmourEx(giveplayerid));
456 SendClientMessage(playerid, -1, string);
457
458 new Float:pos[3];
459 GetPlayerPos(giveplayerid, pos[0], pos[1], pos[2]);
460 format(string, sizeof(string), "PosX: %f PosY: %f PosZ: %f", pos[0], pos[1], pos[2]);
461 SendClientMessage(playerid, -1, string);
462
463 format(string, sizeof(string),"Int: %d", GetPlayerInterior(giveplayerid));
464 SendClientMessage(playerid, -1, string);
465
466 format(string, sizeof(string),"Virtual World: %d", GetPlayerVirtualWorld(giveplayerid));
467 SendClientMessage(playerid, -1, string);
468
469 return 1;
470}
471
472// PROCEDIMENTOS
473
474stock SavePlayerData(playerid)
475{
476 PlayerData[playerid][armor] = GetPlayerArmourEx(playerid);
477 PlayerData[playerid][health] = GetPlayerHealthEx(playerid);
478 PlayerData[playerid][money] = GetPlayerMoney(playerid);
479 PlayerData[playerid][skin] = GetPlayerSkin(playerid);
480 PlayerData[playerid][interior] = GetPlayerInterior(playerid);
481 PlayerData[playerid][vw] = GetPlayerVirtualWorld(playerid);
482 PlayerData[playerid][score] = GetPlayerScore(playerid);
483 GetPlayerFacingAngle(playerid, PlayerData[playerid][angulo]);
484 GetPlayerPos(playerid,
485 PlayerData[playerid][posX],
486 PlayerData[playerid][posY],
487 PlayerData[playerid][posZ]);
488
489 orm_update(PlayerData[playerid][ormid]);
490}
491
492stock SetPlayerData(playerid)
493{
494 SetPlayerScore(playerid, PlayerData[playerid][score]);
495 SetPlayerHealth(playerid, PlayerData[playerid][health]);
496 SetPlayerArmour(playerid, PlayerData[playerid][armor]);
497 GivePlayerMoney(playerid, PlayerData[playerid][money]);
498 SetPlayerInterior(playerid, PlayerData[playerid][interior]);
499 SetPlayerVirtualWorld(playerid, PlayerData[playerid][vw]);
500}
501
502stock LoadPlayerData(playerid)
503{
504 PlayerData[playerid][logado] = false;
505 format(PlayerData[playerid][nome], MAX_PLAYER_NAME, "%s", GetPlayerNameEx(playerid));
506
507 PlayerData[playerid][ormid] = orm_create("Player", DBConn);
508
509 orm_addvar_int(PlayerData[playerid][ormid], PlayerData[playerid][accid], "id");
510 orm_addvar_string(PlayerData[playerid][ormid], PlayerData[playerid][nome], MAX_PLAYER_NAME, "nome");
511 orm_addvar_string(PlayerData[playerid][ormid], PlayerData[playerid][senha], MAX_PASS_LEN, "senha");
512 orm_addvar_string(PlayerData[playerid][ormid], PlayerData[playerid][pSalt], 11, "salt");
513 orm_addvar_int(PlayerData[playerid][ormid], PlayerData[playerid][admin], "admin");
514 orm_addvar_float(PlayerData[playerid][ormid], PlayerData[playerid][posX], "posX");
515 orm_addvar_float(PlayerData[playerid][ormid], PlayerData[playerid][posY], "posY");
516 orm_addvar_float(PlayerData[playerid][ormid], PlayerData[playerid][posZ], "posZ");
517 orm_addvar_float(PlayerData[playerid][ormid], PlayerData[playerid][angulo], "angulo");
518 orm_addvar_float(PlayerData[playerid][ormid], PlayerData[playerid][health], "health");
519 orm_addvar_float(PlayerData[playerid][ormid], PlayerData[playerid][armor], "armor");
520 orm_addvar_int(PlayerData[playerid][ormid], PlayerData[playerid][money], "dinheiro");
521 orm_addvar_int(PlayerData[playerid][ormid], PlayerData[playerid][score], "score");
522 orm_addvar_int(PlayerData[playerid][ormid], PlayerData[playerid][skin], "skin");
523 orm_addvar_int(PlayerData[playerid][ormid], PlayerData[playerid][interior], "interior");
524 orm_addvar_int(PlayerData[playerid][ormid], PlayerData[playerid][vw], "vw");
525
526 orm_setkey(PlayerData[playerid][ormid], "nome");
527 orm_select(PlayerData[playerid][ormid], "OnPlayerLogin", "d", playerid);
528}
529
530stock LoadDBSettings(filename[])
531{
532 //new host[16], username[MAX_PLAYER_NAME], database[MAX_PLAYER_NAME], pass[16];
533 if(DOF2_FileExists(filename))
534 {
535 format(host, sizeof(host), "%s", DOF2_GetString(filename,"address"));
536 format(username, sizeof(username), "%s", DOF2_GetString(filename,"username"));
537 format(database, sizeof(database), "%s", DOF2_GetString(filename,"database"));
538 format(pass, sizeof(pass), "%s", DOF2_GetString(filename,"password"));
539 }
540 else
541 {
542 DOF2_CreateFile(filename);
543 DOF2_SetString(filename,"address","127.0.0.1");
544 DOF2_SetString(filename,"username","root");
545 DOF2_SetString(filename,"database", " ");
546 DOF2_SetString(filename,"password", " ");
547 DOF2_SaveFile();
548 }
549}
550
551stock Salt()
552{
553 new salt[SALT_LEN];
554 for(new i; i < SALT_LEN; i++)
555 salt[i] = random(79) + 47;
556 return salt;
557}
558
559stock GetPlayerNameEx(playerid)
560{
561 new PlayerName[MAX_PLAYER_NAME];
562 GetPlayerName(playerid, PlayerName, sizeof(PlayerName));
563 return PlayerName;
564}
565
566function Float:GetPlayerHealthEx(playerid)
567{
568 new Float:playerhealth;
569 GetPlayerHealth(playerid, playerhealth);
570 return playerhealth;
571}
572
573function Float:GetPlayerArmourEx(playerid)
574{
575 new Float:playerarmor;
576 GetPlayerArmour(playerid, playerarmor);
577 return playerarmor;
578}