· 6 years ago · Nov 10, 2019, 01:56 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 "" //If you don't have a password, leave the field blank
24#define SQL_DB "" //Your 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
183#if defined FILTERSCRIPT
184
185public OnFilterScriptInit()
186{
187 print("\n--------------------------------------");
188 print(" Login/Register System");
189 print(" by Venom");
190 print(" 2019");
191 print("--------------------------------------\n");
192 return 1;
193}
194
195public OnFilterScriptExit()
196{
197 return 1;
198}
199
200#else
201
202main()
203{
204 print("\n----------------------------------");
205 print(" Blank Gamemode by your name here");
206 print("----------------------------------\n");
207}
208
209#endif
210
211public OnGameModeInit()
212{
213 SetGameModeText("Name of Gamemode");
214 new MySQLOpt: option_id = mysql_init_options();
215 mysql_set_option(option_id, AUTO_RECONNECT, true);
216 g_SQL = mysql_connect(SQL_HOST, SQL_USER, SQL_PASS, SQL_DB, option_id);
217 if(g_SQL == MYSQL_INVALID_HANDLE || mysql_errno(g_SQL) != 0)
218 {
219 print("\n\n [MySQL]: Looking for a database connection...");
220 print("\n\n [MySQL]: No database's found, server closing.");
221 SendRconCommand("exit");
222 return 1;
223 }
224 print("[MySQL]: Successfully connected to database.");
225 mysql_log(ALL);
226 SetupPlayerTable();
227 DisableInteriorEnterExits();
228 EnableStuntBonusForAll(false);
229 ShowPlayerMarkers(PLAYER_MARKERS_MODE_OFF);
230 return 1;
231}
232
233public OnGameModeExit()
234{
235 mysql_close(g_SQL);
236 return 1;
237}
238
239public OnPlayerRequestClass(playerid, classid)
240{
241 SetPlayerCameraPos(playerid, 1129.0918,-1462.7538,15.7530);
242 Player[playerid][IsLoggedIn] = false;
243 return 1;
244}
245
246public OnPlayerConnect(playerid)
247{
248 g_MysqlRaceCheck[playerid]++;
249 SetPlayerPos(playerid, Player[playerid][X_Pos], Player[playerid][Y_Pos], Player[playerid][Z_Pos]);
250 SetPlayerFacingAngle(playerid, Player[playerid][A_Pos]);
251
252 static const empty_player[pInfo];
253
254 Player[playerid] = empty_player;
255
256 GetPlayerName(playerid, Player[playerid][Name], MAX_PLAYER_NAME);
257
258 Player[playerid][pSkin] = 29;
259
260 DisablePlayerCheckpoint(playerid);
261
262 new query[103];
263 mysql_format(g_SQL, query, sizeof query, "SELECT * FROM `players` WHERE `username` = '%e' LIMIT 1", Player[playerid][Name]);
264 mysql_tquery(g_SQL, query, "OnPlayerDataLoaded", "dd", playerid, g_MysqlRaceCheck[playerid]);
265
266 GetPlayerName(playerid, Player[playerid][Name], 24);
267 return 1;
268}
269
270public OnPlayerDisconnect(playerid, reason)
271{
272 g_MysqlRaceCheck[playerid]++;
273 UpdatePlayerData(playerid, reason);
274
275 if (cache_is_valid(Player[playerid][Cache_ID]))
276 {
277 cache_delete(Player[playerid][Cache_ID]);
278 Player[playerid][Cache_ID] = MYSQL_INVALID_CACHE;
279 }
280
281 if(Player[playerid][LoginTimer])
282 {
283 KillTimer(Player[playerid][LoginTimer]);
284 Player[playerid][LoginTimer] = 0;
285 }
286 Player[playerid][pSkin] = GetPlayerSkin(playerid);
287 Player[playerid][IsLoggedIn] = false;
288 GetPlayerSkin(playerid);
289 new query[250];
290 mysql_format(g_SQL, query, sizeof(query),"UPDATE `players` SET `skin`=%d WHERE `id`=%d", Player[playerid][pSkin], Player[playerid][ID]);
291 mysql_query(g_SQL, query);
292 return 1;
293}
294
295public OnPlayerSpawn(playerid)
296{
297 SetPlayerSkin(playerid, Player[playerid][pSkin]);
298 return 1;
299}
300
301public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
302{
303 switch(dialogid)
304 {
305 case DIALOG_LOGIN:
306 {
307 new hashed_password[65];
308 SHA256_PassHash(inputtext, Player[playerid][Salt], hashed_password, 65);
309 if(strcmp(hashed_password, Player[playerid][Password]) == 0)
310 {
311 SendClientMessage(playerid, -1, "Successfully logged in.");
312 cache_set_active(Player[playerid][Cache_ID]);
313 AssignPlayerData(playerid);
314 cache_delete(Player[playerid][Cache_ID]);
315 Player[playerid][Cache_ID] = MYSQL_INVALID_CACHE;
316 KillTimer(Player[playerid][LoginTimer]);
317 Player[playerid][LoginTimer] = 0;
318 Player[playerid][IsLoggedIn] = true;
319 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);
320 SpawnPlayer(playerid);
321 }
322 else
323 {
324 if(!response) return Kick(playerid);
325 Player[playerid][LoginAttempts]++;
326
327 if(Player[playerid][LoginAttempts] == 3)
328 {
329 ShowPlayerDialog(playerid, DIALOG_UNUSED, DIALOG_STYLE_MSGBOX, "Login System", "You have exhausted your access attempts. "COL_RED"(3/3).", "Quit", "");
330 DelayedKick(playerid);
331 }
332 else
333 {
334 ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Login System", "Wrong password!\n Enter your password below.", "Login", "Quit");
335 }
336 }
337 }
338 case DIALOG_REGISTER:
339 {
340 if(!response) return Kick(playerid);
341 if(strlen(inputtext) <= 4) return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Register System", "The password must contain at least 5 characters.\n Enter a valid password below.", "Next", "Quit");
342 for (new i = 0; i < 16; i++) Player[playerid][Salt][i] = random(94) + 33;
343 SHA256_PassHash(inputtext, Player[playerid][Salt], Player[playerid][Password], 65);
344 new query[280];
345 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]);
346 mysql_tquery(g_SQL, query, "OnPlayerRegister", "d", playerid);
347 }
348 case DIALOG_SKIN:
349 {
350 if(!response) return Kick(playerid);
351 new skinid;
352 skinid = strval(inputtext);
353 {
354 if(skinid < 1 || skinid > 311) return ShowPlayerDialog(playerid, DIALOG_SKIN, DIALOG_STYLE_INPUT, "Registration System", "Select a skin.\nAvailable id's: 1-311.", "Next", "Quit");
355 }
356 SetPlayerSkin(playerid, skinid);
357 new query[280];
358 mysql_tquery(g_SQL, query, "OnPlayerRegisterCorrectly", "d", playerid);
359 }
360 }
361 return 1;
362}
363
364
365forward OnPlayerDataLoaded(playerid, race_check);
366public OnPlayerDataLoaded(playerid, race_check)
367{
368 if(race_check != g_MysqlRaceCheck[playerid]) return Kick(playerid);
369 if(cache_num_rows() > 0)
370 {
371 cache_get_value(0, "password", Player[playerid][Password], 65);
372 cache_get_value(0, "salt", Player[playerid][Salt], 17);
373 Player[playerid][Cache_ID] = cache_save();
374 ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Login System", "Enter your password to log in.\n You have 60 seconds to log in.", "Next", "Quit");
375 Player[playerid][LoginTimer] = SetTimerEx("OnLoginTimeout", SECONDS_TO_LOGIN * 1000, false, "d", playerid);
376 }
377 else
378 {
379 new string[128];
380 format(string, sizeof(string), "Welcome %s, to register a new account enter a password below.", RemoveUnderScore(playerid));
381 ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD,"Registration System", string, "Next", "Quit");
382 }
383 return 1;
384}
385
386forward OnLoginTimeout(playerid);
387public OnLoginTimeout(playerid)
388{
389 Player[playerid][LoginTimer] = 0;
390 ShowPlayerDialog(playerid, DIALOG_UNUSED, DIALOG_STYLE_MSGBOX, "Login System", "You have been kicked in.\n Motivation:\n You have run out of time to login.", "Quit", "");
391 DelayedKick(playerid);
392 return 1;
393}
394
395forward OnPlayerRegister(playerid);
396public OnPlayerRegister(playerid)
397{
398 Player[playerid][ID] = cache_insert_id();
399 new skinid, query[128];
400 ShowPlayerDialog(playerid, DIALOG_SKIN, DIALOG_STYLE_INPUT, "Registration System", "Select a skin.\nAvailable id's: 1-311.", "Select", "Quit");
401 SetPlayerSkin(playerid, skinid);
402 mysql_format(g_SQL, query, sizeof query, "UPDATE `players` SET `skin` =%d WHERE `id` =%d LIMIT 1", Player[playerid][pSkin], Player[playerid][ID]);
403 mysql_tquery(g_SQL, query, "", "");
404 Player[playerid][IsLoggedIn] = true;
405 Player[playerid][X_Pos] = DEFAULT_POS_X;
406 Player[playerid][Y_Pos] = DEFAULT_POS_Y;
407 Player[playerid][Z_Pos] = DEFAULT_POS_Z;
408 Player[playerid][A_Pos] = DEFAULT_POS_A;
409 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);
410 SpawnPlayer(playerid);
411 mysql_tquery(g_SQL, query, "OnPlayerRegisterCorrectly", "d", playerid);
412 return 1;
413}
414
415forward OnPlayerRegisterCorrectly(playerid);
416public OnPlayerRegisterCorrectly(playerid)
417{
418 GivePlayerMoney(playerid, 5000);
419 SendFormattedMessage(playerid, COLOR_GREEN, "You registered correctly. Welcome %s!", GetName(playerid));
420 return 1;
421}
422forward _KickPlayerDelayed(playerid);
423public _KickPlayerDelayed(playerid)
424{
425 Kick(playerid);
426 return 1;
427}
428
429AssignPlayerData(playerid)
430{
431 cache_get_value_int(0, "id", Player[playerid][ID]);
432 cache_get_value_int(0, "skin", Player[playerid][pSkin]);
433 cache_get_value_float(0, "x", Player[playerid][X_Pos]);
434 cache_get_value_float(0, "y", Player[playerid][Y_Pos]);
435 cache_get_value_float(0, "z", Player[playerid][X_Pos]);
436 cache_get_value_float(0, "angle", Player[playerid][A_Pos]);
437 return 1;
438}
439
440DelayedKick(playerid, time = 500)
441{
442 SetTimerEx("_KickPlayerDelayed", time, false, "d", playerid);
443 return 1;
444}
445
446SetupPlayerTable()
447{
448 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`))");
449 return 1;
450}
451
452UpdatePlayerData(playerid, reason)
453{
454 if (Player[playerid][IsLoggedIn] == false) return 0;
455 if (reason == 1)
456 {
457 GetPlayerPos(playerid, Player[playerid][X_Pos], Player[playerid][Y_Pos], Player[playerid][Z_Pos]);
458 GetPlayerFacingAngle(playerid, Player[playerid][A_Pos]);
459 }
460
461 new query[145];
462 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]);
463 mysql_tquery(g_SQL, query);
464 return 1;
465}