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