· 6 years ago · Nov 10, 2019, 01:58 AM
1//Venom
2//Register Login System V1.0 MYSQL
3
4
5#include <a_samp>
6#include <a_mysql>
7#include <streamer>
8#include <easyDialog>
9#include <sscanf2>
10
11#pragma unused SAMP_INCLUDES_VERSION
12
13#undef MAX_PLAYERS
14#define MAX_PLAYERS 200
15
16#undef MAX_VEHICLES
17#define MAX_VEHICLES 500
18
19new MySQL:g_SQL;
20
21#define SQL_HOST "127.0.0.1"
22#define SQL_USER "root"
23#define SQL_PASS "" //Se non hai una password lascia vuoto.
24#define SQL_DB "" //Il nome del tuo database.
25
26#define SECONDS_TO_LOGIN 60
27
28#define DEFAULT_POS_X 1129.1920
29#define DEFAULT_POS_Y -1466.2002
30#define DEFAULT_POS_Z 15.7530
31#define DEFAULT_POS_A 1.2959
32
33#define DIALOG_UNUSED 1
34#define DIALOG_LOGIN 2
35#define DIALOG_REGISTER 3
36#define DIALOG_SKIN 4
37#define DIALOG_NAME 5
38
39#define COLOR_MECHANIC (0x005A83FF)
40#define COLOR_TAXI (0xB8860BFF)
41#define COLOR_WHITE (0xFFFFFFFF)
42#define COLOR_ERROR (0xa52a2aff)
43#define COLOR_YELLOW (0xFFFF00AA)
44#define COLOR_ADMIN (0xFF6347FF)
45#define COLOR_ORANGE (0xEA7500FF)
46#define COLOR_PURPLE (0xD0AEEBFF)
47#define COLOR_FADE1 (0xE6E6E6E6)
48#define COLOR_FADE2 (0xC8C8C8C8)
49#define COLOR_FADE3 (0xAAAAAAAA)
50#define COLOR_FADE4 (0x8C8C8C8C)
51#define COLOR_FADE5 (0x6E6E6E6E)
52#define COLOR_HOUSE (0xE0EA64AA)
53#define COLOR_BIZ (0x33CCFFFF)
54#define COLOR_GREY (0xAFAFAFFF)
55#define COLOR_LIGHTBLUE (0xA9C4E4FF)
56#define COLOR_SENDPM (0xE5C43EFF)
57#define COLOR_RECEIVEPM (0xffdb18AA)
58#define COLOR_GREEN (0x33AA33AA)
59#define COLOR_MODCHAT (0xE1A400FF)
60#define COLOR_ADMINCHAT (0x876200FF)
61#define COLOR_LIGHTGREEN (0x9ACD32FF)
62#define COLOR_SUPPORTER (0xe9de98ff)
63#define COLOR_SUPPORTERNICK (0xa52a2aff)
64#define COLOR_SLATEBLUE (0x6A5ACDFF)
65#define COLOR_RED (0xFF0000AA)
66#define COLOR_GREEN (0x33AA33AA)
67#define COLOR_CYAN (0x00FFFFFF)
68#define COLOR_PDRAD (0x297CCFFF)
69#define COLOR_BLUE (0x102c54)
70#define COLOR_TRANS (0xFFFFFF00)
71#define COLOR_TOMATO (0xFF6347FF)
72#define COLOR_DEFAULT (0xA9C4E4FF)
73#define COL_TOMATO "{FF6347}"
74#define COL_YELLOW "{FFDD00}"
75#define COL_DEFAULT "{A9C4E4}"
76#define COL_ERROR "{a52a2a}"
77#define COL_WHITE "{FFFFFF}"
78#define COL_RED "{F81414}"
79#define COL_GREEN "{00FF22}"
80#define COL_LIGHTBLUE "{00CED1}"
81#define COL_BIANCO "{FFFFFF}"
82#define COL_ROSSO "{FF0000}"
83#define COL_VERDE "{00FF22}"
84#define COL_LBLUE "{00CED1}"
85
86stock RemoveUnderScore(playerid)
87{
88 new name[MAX_PLAYER_NAME];
89 GetPlayerName(playerid,name,sizeof(name));
90 for(new i = 0; i < MAX_PLAYER_NAME; i++)
91 {
92 if(name[i] == '_') name[i] = ' ';
93 }
94 return name;
95}
96
97GetName(playerid)
98{
99 new name[MAX_PLAYERS];
100 GetPlayerName(playerid, name, sizeof(name));
101 return name;
102}
103
104#define BYTES_PER_CELL 4
105stock SendFormattedMessage(playerid, color, fstring[], {Float, _}:...)
106{
107 static const STATIC_ARGS = 3;
108 new n = (numargs() - STATIC_ARGS) * BYTES_PER_CELL;
109 if(n)
110 {
111 new message[144],arg_start,arg_end;
112 #emit CONST.alt fstring
113 #emit LCTRL 5
114 #emit ADD
115 #emit STOR.S.pri arg_start
116
117 #emit LOAD.S.alt n
118 #emit ADD
119 #emit STOR.S.pri arg_end
120 do
121 {
122 #emit LOAD.I
123 #emit PUSH.pri
124 arg_end -= BYTES_PER_CELL;
125 #emit LOAD.S.pri arg_end
126 }
127 while(arg_end > arg_start);
128
129 #emit PUSH.S fstring
130 #emit PUSH.C 144
131 #emit PUSH.ADR message
132
133 n += BYTES_PER_CELL * 3;
134 #emit PUSH.S n
135 #emit SYSREQ.C format
136
137 n += BYTES_PER_CELL;
138 #emit LCTRL 4
139 #emit LOAD.S.alt n
140 #emit ADD
141 #emit SCTRL 4
142
143 if(playerid == INVALID_PLAYER_ID)
144 {
145 #pragma unused playerid
146 return SendClientMessageToAll(color, message);
147 } else {
148 return SendClientMessage(playerid, color, message);
149 }
150 } else {
151 if(playerid == INVALID_PLAYER_ID)
152 {
153 #pragma unused playerid
154 return SendClientMessageToAll(color, fstring);
155 } else {
156 return SendClientMessage(playerid, color, fstring);
157 }
158 }
159}
160
161enum pInfo
162{
163 ID,
164 Name[MAX_PLAYER_NAME],
165 Password[65],
166 Salt[17],
167 Float: X_Pos,
168 Float: Y_Pos,
169 Float: Z_Pos,
170 Float: A_Pos,
171 Cache: Cache_ID,
172 bool: IsLoggedIn,
173 LoginAttempts,
174 LoginTimer,
175 pSkin
176
177}
178
179new Player[MAX_PLAYERS][pInfo];
180new g_MysqlRaceCheck[MAX_PLAYERS];
181
182#if defined FILTERSCRIPT
183
184public OnFilterScriptInit()
185{
186 print("\n--------------------------------------");
187 print(" Login/Register System");
188 print(" by Venom");
189 print(" 2019");
190 print("--------------------------------------\n");
191 return 1;
192}
193
194public OnFilterScriptExit()
195{
196 return 1;
197}
198
199#else
200
201main()
202{
203 print("\n----------------------------------");
204 print(" Blank Gamemode by your name here");
205 print("----------------------------------\n");
206}
207
208#endif
209
210public OnGameModeInit()
211{
212 SetGameModeText("Nome gamemode");
213 new MySQLOpt: option_id = mysql_init_options();
214 mysql_set_option(option_id, AUTO_RECONNECT, true);
215 g_SQL = mysql_connect(SQL_HOST, SQL_USER, SQL_PASS, SQL_DB, option_id);
216 if(g_SQL == MYSQL_INVALID_HANDLE || mysql_errno(g_SQL) != 0)
217 {
218 print("\n\n [MySQL]: Cercando una connessione al database...");
219 print("\n\n [MySQL]: Nessun database trovato, il server si sta chiudendo.");
220 SendRconCommand("exit");
221 return 1;
222 }
223 print("[MySQL]: Connesso correttamente al database.");
224 mysql_log(ALL);
225 SetupPlayerTable();
226 DisableInteriorEnterExits();
227 EnableStuntBonusForAll(false);
228 ShowPlayerMarkers(PLAYER_MARKERS_MODE_OFF);
229 return 1;
230}
231
232public OnGameModeExit()
233{
234 mysql_close(g_SQL);
235 return 1;
236}
237
238public OnPlayerRequestClass(playerid, classid)
239{
240 SetPlayerCameraPos(playerid, 1129.0918,-1462.7538,15.7530);
241 Player[playerid][IsLoggedIn] = false;
242 return 1;
243}
244
245public OnPlayerConnect(playerid)
246{
247 g_MysqlRaceCheck[playerid]++;
248 SetPlayerPos(playerid, Player[playerid][X_Pos], Player[playerid][Y_Pos], Player[playerid][Z_Pos]);
249 SetPlayerFacingAngle(playerid, Player[playerid][A_Pos]);
250
251 static const empty_player[pInfo];
252
253 Player[playerid] = empty_player;
254
255 GetPlayerName(playerid, Player[playerid][Name], MAX_PLAYER_NAME);
256
257 Player[playerid][pSkin] = 29;
258
259 DisablePlayerCheckpoint(playerid);
260
261 new query[103];
262 mysql_format(g_SQL, query, sizeof query, "SELECT * FROM `players` WHERE `username` = '%e' LIMIT 1", Player[playerid][Name]);
263 mysql_tquery(g_SQL, query, "OnPlayerDataLoaded", "dd", playerid, g_MysqlRaceCheck[playerid]);
264
265 GetPlayerName(playerid, Player[playerid][Name], 24);
266 return 1;
267}
268
269public OnPlayerDisconnect(playerid, reason)
270{
271 g_MysqlRaceCheck[playerid]++;
272 UpdatePlayerData(playerid, reason);
273
274 if (cache_is_valid(Player[playerid][Cache_ID]))
275 {
276 cache_delete(Player[playerid][Cache_ID]);
277 Player[playerid][Cache_ID] = MYSQL_INVALID_CACHE;
278 }
279
280 if(Player[playerid][LoginTimer])
281 {
282 KillTimer(Player[playerid][LoginTimer]);
283 Player[playerid][LoginTimer] = 0;
284 }
285 Player[playerid][pSkin] = GetPlayerSkin(playerid);
286 Player[playerid][IsLoggedIn] = false;
287 GetPlayerSkin(playerid);
288 new query[250];
289 mysql_format(g_SQL, query, sizeof(query),"UPDATE `players` SET `skin`=%d WHERE `id`=%d", Player[playerid][pSkin], Player[playerid][ID]);
290 mysql_query(g_SQL, query);
291 return 1;
292}
293
294public OnPlayerSpawn(playerid)
295{
296 SetPlayerSkin(playerid, Player[playerid][pSkin]);
297 return 1;
298}
299
300public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
301{
302 switch(dialogid)
303 {
304 case DIALOG_LOGIN:
305 {
306 new hashed_password[65];
307 SHA256_PassHash(inputtext, Player[playerid][Salt], hashed_password, 65);
308 if(strcmp(hashed_password, Player[playerid][Password]) == 0)
309 {
310 SendClientMessage(playerid, -1, "Ti sei loggato correttamente.");
311 cache_set_active(Player[playerid][Cache_ID]);
312 AssignPlayerData(playerid);
313 cache_delete(Player[playerid][Cache_ID]);
314 Player[playerid][Cache_ID] = MYSQL_INVALID_CACHE;
315 KillTimer(Player[playerid][LoginTimer]);
316 Player[playerid][LoginTimer] = 0;
317 Player[playerid][IsLoggedIn] = true;
318 SetSpawnInfo(playerid, NO_TEAM, 0, Player[playerid][X_Pos], Player[playerid][Y_Pos], Player[playerid][Z_Pos], Player[playerid][A_Pos], 0, 0, 0, 0, 0, 0);
319 SpawnPlayer(playerid);
320 }
321 else
322 {
323 if(!response) return Kick(playerid);
324 Player[playerid][LoginAttempts]++;
325
326 if(Player[playerid][LoginAttempts] == 3)
327 {
328 ShowPlayerDialog(playerid, DIALOG_UNUSED, DIALOG_STYLE_MSGBOX, "Login System", "Hai esaurito i tentativi di login. "COL_RED"(3/3).", "Esci", "");
329 DelayedKick(playerid);
330 }
331 else
332 {
333 ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Login System", "Password errata!\n Inserisci la tua password qui sotto.", "Continua", "Esci");
334 }
335 }
336 }
337 case DIALOG_REGISTER:
338 {
339 if(!response) return Kick(playerid);
340 if(strlen(inputtext) <= 4) return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Register System", "La password deve contenere minimo 5 caratteri.\n Inserisci una password valida qui sotto.", "Avanti", "Esci");
341 for (new i = 0; i < 16; i++) Player[playerid][Salt][i] = random(94) + 33;
342 SHA256_PassHash(inputtext, Player[playerid][Salt], Player[playerid][Password], 65);
343 new query[280];
344 mysql_format(g_SQL, query, sizeof query, "INSERT INTO `players` (`username`, `password`, `salt`) VALUES ('%e', '%s', '%e')", Player[playerid][Name], Player[playerid][Password], Player[playerid][Salt]);
345 mysql_tquery(g_SQL, query, "OnPlayerRegister", "d", playerid);
346 }
347 case DIALOG_SKIN:
348 {
349 if(!response) return Kick(playerid);
350 new skinid;
351 skinid = strval(inputtext);
352 {
353 if(skinid < 1 || skinid > 311) return ShowPlayerDialog(playerid, DIALOG_SKIN, DIALOG_STYLE_INPUT, "Registration System", "Seleziona una skin.\nID disponibili: 1-311.", "Avanti", "Esci");
354 }
355 SetPlayerSkin(playerid, skinid);
356 new query[280];
357 mysql_tquery(g_SQL, query, "OnPlayerRegisterCorrectly", "d", playerid);
358 }
359 }
360 return 1;
361}
362
363
364forward OnPlayerDataLoaded(playerid, race_check);
365public OnPlayerDataLoaded(playerid, race_check)
366{
367 if(race_check != g_MysqlRaceCheck[playerid]) return Kick(playerid);
368 if(cache_num_rows() > 0)
369 {
370 cache_get_value(0, "password", Player[playerid][Password], 65);
371 cache_get_value(0, "salt", Player[playerid][Salt], 17);
372 Player[playerid][Cache_ID] = cache_save();
373 ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Login System", "Inserisci la tua password per loggare.\n Hai 60 secondi per effettuare il login.", "Avanti", "Esci");
374 Player[playerid][LoginTimer] = SetTimerEx("OnLoginTimeout", SECONDS_TO_LOGIN * 1000, false, "d", playerid);
375 }
376 else
377 {
378 new string[128];
379 format(string, sizeof(string), "Benvenuto %s, per registrare il tuo account inserisci una password qui sotto.", RemoveUnderScore(playerid));
380 ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD,"Registration System", string, "Avanti", "Esci");
381 }
382 return 1;
383}
384
385forward OnLoginTimeout(playerid);
386public OnLoginTimeout(playerid)
387{
388 Player[playerid][LoginTimer] = 0;
389 ShowPlayerDialog(playerid, DIALOG_UNUSED, DIALOG_STYLE_MSGBOX, "Login System", "Sei stato kickato.\n Motivazione:\n Hai esaurito il tempo disponibile per il login.", "Esci", "");
390 DelayedKick(playerid);
391 return 1;
392}
393
394forward OnPlayerRegister(playerid);
395public OnPlayerRegister(playerid)
396{
397 Player[playerid][ID] = cache_insert_id();
398 new skinid, query[128];
399 ShowPlayerDialog(playerid, DIALOG_SKIN, DIALOG_STYLE_INPUT, "Registration System", "Seleziona una skin.\nID disponibili: 1-311.", "Seleziona", "Esci");
400 SetPlayerSkin(playerid, skinid);
401 mysql_format(g_SQL, query, sizeof query, "UPDATE `players` SET `skin` =%d WHERE `id` =%d LIMIT 1", Player[playerid][pSkin], Player[playerid][ID]);
402 mysql_tquery(g_SQL, query, "", "");
403 Player[playerid][IsLoggedIn] = true;
404 Player[playerid][X_Pos] = DEFAULT_POS_X;
405 Player[playerid][Y_Pos] = DEFAULT_POS_Y;
406 Player[playerid][Z_Pos] = DEFAULT_POS_Z;
407 Player[playerid][A_Pos] = DEFAULT_POS_A;
408 SetSpawnInfo(playerid, NO_TEAM, Player[playerid][pSkin], Player[playerid][X_Pos], Player[playerid][Y_Pos], Player[playerid][Z_Pos], Player[playerid][A_Pos], 0, 0, 0, 0, 0, 0);
409 SpawnPlayer(playerid);
410 mysql_tquery(g_SQL, query, "OnPlayerRegisterCorrectly", "d", playerid);
411 return 1;
412}
413
414forward OnPlayerRegisterCorrectly(playerid);
415public OnPlayerRegisterCorrectly(playerid)
416{
417 GivePlayerMoney(playerid, 5000);
418 SendFormattedMessage(playerid, COLOR_GREEN, "Ti sei registrato correttamente. Benvenuto %s!", GetName(playerid));
419 return 1;
420}
421forward _KickPlayerDelayed(playerid);
422public _KickPlayerDelayed(playerid)
423{
424 Kick(playerid);
425 return 1;
426}
427
428AssignPlayerData(playerid)
429{
430 cache_get_value_int(0, "id", Player[playerid][ID]);
431 cache_get_value_int(0, "skin", Player[playerid][pSkin]);
432 cache_get_value_float(0, "x", Player[playerid][X_Pos]);
433 cache_get_value_float(0, "y", Player[playerid][Y_Pos]);
434 cache_get_value_float(0, "z", Player[playerid][X_Pos]);
435 cache_get_value_float(0, "angle", Player[playerid][A_Pos]);
436 return 1;
437}
438
439DelayedKick(playerid, time = 500)
440{
441 SetTimerEx("_KickPlayerDelayed", time, false, "d", playerid);
442 return 1;
443}
444
445SetupPlayerTable()
446{
447 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,`skin` int(10) NOT NULL DEFAULT '0',`x` float NOT NULL DEFAULT '0',`y` float NOT NULL DEFAULT '0',`z` float NOT NULL DEFAULT '0',`angle` float NOT NULL DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `username` (`username`))");
448 return 1;
449}
450
451UpdatePlayerData(playerid, reason)
452{
453 if (Player[playerid][IsLoggedIn] == false) return 0;
454 if (reason == 1)
455 {
456 GetPlayerPos(playerid, Player[playerid][X_Pos], Player[playerid][Y_Pos], Player[playerid][Z_Pos]);
457 GetPlayerFacingAngle(playerid, Player[playerid][A_Pos]);
458 }
459
460 new query[145];
461 mysql_format(g_SQL, query, sizeof query, "UPDATE `players` SET `x` = %f, `y` = %f, `z` = %f, `angle` = %f, `interior` = %d WHERE `id` = %d LIMIT 1", Player[playerid][X_Pos], Player[playerid][Y_Pos], Player[playerid][Z_Pos], Player[playerid][A_Pos], GetPlayerInterior(playerid), Player[playerid][ID]);
462 mysql_tquery(g_SQL, query);
463 return 1;
464}