· 8 years ago · Mar 17, 2018, 08:04 AM
1#include <a_samp>
2#include <a_mysql>
3#include <Pawn.CMD>
4#include <sscanf2>
5
6#undef MAX_PLAYERS
7#define MAX_PLAYERS 50
8
9#define MYSQL_HOST "127.0.0.1"
10#define MYSQL_USER "root"
11#define MYSQL_PASSWORD ""
12#define MYSQL_DATABASE "server"
13
14#define SCM SendClientMessage
15#define SPD ShowPlayerDialog
16#define DSP DIALOG_STYLE_PASSWORD
17#define DSI DIALOG_STYLE_INPUT
18#define DSM DIALOG_STYLE_MSGBOX
19
20#define func%0(%1) forward%0(%1); public%0(%1)
21
22new MySQL: g_SQL;
23
24enum E_PLAYERS
25{
26 ID,
27 Name[MAX_PLAYER_NAME],
28 Password[65],
29 Salt[17],
30 Kills,
31 Deaths,
32
33 Cache: Cache_ID,
34};
35new PI[MAX_PLAYERS][E_PLAYERS];
36
37new g_MysqlRaceCheck[MAX_PLAYERS];
38
39enum
40{
41
42 DIALOG_LOGIN,
43 DIALOG_REGISTER
44};
45
46main() {}
47
48
49public OnGameModeInit()
50{
51 new MySQLOpt: option_id = mysql_init_options();
52
53 mysql_set_option(option_id, AUTO_RECONNECT, true);
54
55 g_SQL = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, option_id); // AUTO_RECONNECT is enabled for this connection handle only
56 if (g_SQL == MYSQL_INVALID_HANDLE || mysql_errno(g_SQL) != 0)
57 {
58 print("MySQL konekcija neuspesna. Proverite podatke i databazu");
59 SendRconCommand("exit");
60 return 1;
61 }
62
63 print("MySQL konekcija, uspesna");
64
65 SetupPlayerTable();
66 return 1;
67}
68
69public OnGameModeExit()
70{
71 mysql_close(g_SQL);
72 return 1;
73}
74
75public OnPlayerConnect(playerid)
76{
77 g_MysqlRaceCheck[playerid]++;
78
79 static const empty_player[E_PLAYERS];
80 PI[playerid] = empty_player;
81
82 GetPlayerName(playerid, PI[playerid][Name], MAX_PLAYER_NAME);
83
84 new query[103];
85 mysql_format(g_SQL, query, sizeof query, "SELECT * FROM `players` WHERE `username` = '%e' LIMIT 1", PI[playerid][Name]);
86 mysql_tquery(g_SQL, query, "OnPlayerDataLoaded", "dd", playerid, g_MysqlRaceCheck[playerid]);
87 return 1;
88}
89
90public OnPlayerDisconnect(playerid, reason)
91{
92 g_MysqlRaceCheck[playerid]++;
93
94 if (cache_is_valid(PI[playerid][Cache_ID]))
95 {
96 cache_delete(PI[playerid][Cache_ID]);
97 PI[playerid][Cache_ID] = MYSQL_INVALID_CACHE;
98 }
99 return 1;
100}
101
102public OnPlayerDeath(playerid, killerid, reason)
103{
104 PI[ playerid ][ Deaths ]++;
105 PI[ playerid ][ Kills ]++;
106
107 new query[125];
108 mysql_format(g_SQL, query, sizeof query, "UPDATE `players` SET `kills` = %d, `deaths` = %d WHERE `id` = %d", PI[playerid][Kills], PI[playerid][Deaths], PI[playerid][ID]);
109 mysql_tquery(g_SQL, query);
110
111 mysql_format(g_SQL, query, sizeof query, "UPDATE `players` SET `kills` = %d, `deaths` = %d WHERE `id` = %d", PI[killerid][Kills], PI[killerid][Deaths], PI[killerid][ID]);
112 mysql_tquery(g_SQL, query);
113 return 1;
114}
115
116public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
117{
118 switch (dialogid)
119 {
120 case DIALOG_LOGIN:
121 {
122 if (!response) return Kick(playerid);
123
124 new hashed_pass[65];
125 SHA256_PassHash(inputtext, PI[playerid][Salt], hashed_pass, 65);
126
127 if (strcmp(hashed_pass, PI[playerid][Password]) == 0)
128 {
129 SCM(playerid, -1, "Uspesno ste se ulogovali");
130
131 cache_set_active(PI[playerid][Cache_ID]);
132
133 AssignPlayerData(playerid);
134
135 cache_delete(PI[playerid][Cache_ID]);
136 PI[playerid][Cache_ID] = MYSQL_INVALID_CACHE;
137
138 SpawnPlayer(playerid);
139 }
140 else
141 {
142 SPD(playerid, DIALOG_LOGIN, DSP, "Login", "Pogresna lozinka!\nUnesite vasu lozinku ispod", "Login", "Izlaz");
143 }
144 }
145 case DIALOG_REGISTER:
146 {
147 if (!response) return Kick(playerid);
148
149 if (strlen(inputtext) <= 5) return SPD(playerid, DIALOG_REGISTER, DSP, "Registracija", "Vasa lozinka ne sme biti ispod 5 karaktera", "Registruj se", "Izlaz");
150
151 for (new i = 0; i < 16; i++) PI[playerid][Salt][i] = random(94) + 33;
152 SHA256_PassHash(inputtext, PI[playerid][Salt], PI[playerid][Password], 65);
153
154 new query[221];
155 mysql_format(g_SQL, query, sizeof query, "INSERT INTO `players` (`username`, `password`, `salt`) VALUES ('%e', '%s', '%e')", PI[playerid][Name], PI[playerid][Password], PI[playerid][Salt]);
156 mysql_tquery(g_SQL, query, "OnPlayerRegister", "d", playerid);
157 }
158 }
159 return 1;
160}
161
162//-----------------------------------------------------
163
164func OnPlayerDataLoaded(playerid, race_check)
165{
166 if (race_check != g_MysqlRaceCheck[playerid]) return Kick(playerid);
167
168 if(cache_num_rows() > 0)
169 {
170 cache_get_value(0, "password", PI[playerid][Password], 65);
171 cache_get_value(0, "salt", PI[playerid][Salt], 17);
172
173 PI[playerid][Cache_ID] = cache_save();
174
175 SPD(playerid, DIALOG_LOGIN, DSP, "Login", "Vas nalog postoji", "Login", "Izlaz");
176
177 }
178 else
179 {
180 SPD(playerid, DIALOG_REGISTER, DSP, "Registracija", "Vas nalog ne postoji\nUnesite lozinku", "Registracija", "Izlaz");
181 }
182 return 1;
183}
184
185func OnPlayerRegister(playerid)
186{
187 PI[playerid][ID] = cache_insert_id();
188
189 SpawnPlayer(playerid);
190 return 1;
191}
192
193//-----------------------------------------------------
194
195AssignPlayerData(playerid)
196{
197 cache_get_value_int(0, "id", PI[playerid][ID]);
198
199 cache_get_value_int(0, "kills", PI[playerid][Kills]);
200 cache_get_value_int(0, "deaths", PI[playerid][Deaths]);
201
202 return 1;
203}
204
205SetupPlayerTable()
206{
207 mysql_tquery(g_SQL, "CREATE TABLE IF NOT EXISTS `players` (`id` int(11) NOT NULL AUTO_INCREMENT,`username` varchar(24) NOT NULL,`password` char(64) NOT NULL,`salt` char(16) NOT NULL,`kills` mediumint(8) NOT NULL DEFAULT '0',`deaths` mediumint(8) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `username` (`username`))");
208 return 1;
209}