· 6 years ago · Jul 13, 2019, 02:16 PM
1public OnGameModeInit()
2{
3 UsePlayerPedAnims();
4 AddPlayerClass(0, 1444.0865, -2286.6409, 15.3960, -269.1425, 0, 0, 0, 0, 0, 0);
5 SetGameModeText("NC:RP v1.0");
6 new MySQLOpt: option_id = mysql_init_options();
7 mysql_set_option(option_id, AUTO_RECONNECT, true);
8 Database = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_DATABASE, option_id);
9 if(Database == MYSQL_INVALID_HANDLE || mysql_errno(Database) != 0)
10 {
11 print("I couldn't connect to the MySQL server, closing.");
12 SendRconCommand("exit");
13 return 1;
14 }
15 print("I have connected to the MySQL server.");
16 mysql_tquery(Database, "CREATE TABLE IF NOT EXISTS `PLAYERS` (`ID` int(11) NOT NULL AUTO_INCREMENT,`USERNAME` varchar(24) NOT NULL,`PASSWORD` char(65) NOT NULL,`SALT` char(11) NOT NULL,`SCORE` mediumint(7), `KILLS` mediumint(7), `CASH` mediumint(7) NOT NULL DEFAULT '0',`DEATHS` mediumint(7) NOT NULL DEFAULT '0', PRIMARY KEY (`ID`), UNIQUE KEY `USERNAME` (`USERNAME`), `AGE` mediument(7) NOT NULL, `GENDER` varchar(10) NOT NULL, `SKIN` mediument(7) NOT NULL)");
17 return 1;
18}
19
20public OnPlayerConnect(playerid)
21{
22 SetPlayerColor(playerid, -1);
23
24 new DB_Query[500];
25
26 pInfo[playerid][Kills] = 0;
27 pInfo[playerid][Deaths] = 0;
28 pInfo[playerid][PasswordFails] = 0;
29
30 GetPlayerName(playerid, pInfo[playerid][Name], MAX_PLAYER_NAME);
31 Corrupt_Check[playerid]++;
32
33 mysql_format(Database, DB_Query, sizeof(DB_Query), "SELECT * FROM `PLAYERS` WHERE `USERNAME` = '%e' LIMIT 1", pInfo[playerid][Name]);
34 mysql_tquery(Database, DB_Query, "OnPlayerDataCheck", "ii", playerid, Corrupt_Check[playerid]);
35 return 1;
36}
37
38
39public OnPlayerDisconnect(playerid, reason)
40{
41 Corrupt_Check[playerid]++;
42
43 new DB_Query[500]; //256
44
45 mysql_format(Database, DB_Query, sizeof(DB_Query), "UPDATE `PLAYERS` SET `SCORE` = %d, `CASH` = %d, `KILLS` = %d, `DEATHS` = %d, WHERE `ID` = %d LIMIT 1, `AGE` = %d, `GENDER` = %d, `SKIN` = %d, ",
46 pInfo[playerid][Score], pInfo[playerid][Cash], pInfo[playerid][Kills], pInfo[playerid][Deaths], pInfo[playerid][Age], pInfo[playerid][Gender], pInfo[playerid][Skin], pInfo[playerid][ID]);
47
48 mysql_tquery(Database, DB_Query);
49
50 if(cache_is_valid(pInfo[playerid][Player_Cache]))
51 {
52 cache_delete(pInfo[playerid][Player_Cache]);
53 pInfo[playerid][Player_Cache] = MYSQL_INVALID_CACHE;
54 }
55
56 pInfo[playerid][LoggedIn] = false;
57 print("OnPlayerDisconnect has been called.");
58 return 1;
59}
60
61
62
63public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
64{
65 switch (dialogid)
66 {
67 case DIALOG_LOGIN:
68 {
69 if(!response) return Kick(playerid);
70
71 new Salted_Key[65];
72 SHA256_PassHash(inputtext, pInfo[playerid][Salt], Salted_Key, 65);
73
74 if(strcmp(Salted_Key, pInfo[playerid][Password]) == 0)
75 {
76
77 cache_set_active(pInfo[playerid][Player_Cache]);
78
79 cache_get_value_int(0, "ID", pInfo[playerid][ID]);
80
81 cache_get_value_int(0, "KILLS", pInfo[playerid][Kills]);
82 cache_get_value_int(0, "DEATHS", pInfo[playerid][Deaths]);
83
84 cache_get_value_int(0, "SCORE", pInfo[playerid][Score]);
85 cache_get_value_int(0, "CASH", pInfo[playerid][Cash]);
86
87 cache_get_value_name(0, "GENDER", pInfo[playerid][Gender], 10);
88 cache_get_value_int(0, "AGE", pInfo[playerid][Age]);
89
90 cache_get_value_int(0, "SKIN", pInfo[playerid][Skin]);
91
92 SetPlayerScore(playerid, pInfo[playerid][Score]);
93
94 ResetPlayerMoney(playerid);
95 GivePlayerMoney(playerid, pInfo[playerid][Cash]);
96
97 cache_delete(pInfo[playerid][Player_Cache]);
98 pInfo[playerid][Player_Cache] = MYSQL_INVALID_CACHE;
99 pInfo[playerid][LoggedIn] = true;
100 SCM(playerid, COLOR_WHITE2, "You have successfully logged into your account!");
101 }
102 else
103 {
104 new String[100];
105
106 pInfo[playerid][PasswordFails] += 1;
107 printf("%s has been failed to login. (%d)", pInfo[playerid][Name], pInfo[playerid][PasswordFails]);
108
109 if (pInfo[playerid][PasswordFails] >= 3)
110 {
111 format(String, sizeof(String), "%s has been kicked Reason: {FF0000}(%d/3) Login fails.", pInfo[playerid][Name], pInfo[playerid][PasswordFails]);
112 SCMTA(0x969696FF, String);
113 Kick(playerid);
114 }
115 else
116 {
117 format(String, sizeof(String), "Wrong password, you have %d out of 3 tries.", pInfo[playerid][PasswordFails]);
118 SCM(playerid, 0xFF0000FF, String);
119
120 format(String, sizeof(String), "{FFFFFF}Welcome back, %s.\n\n{0099FF}This account is already registered.\n\
121 {0099FF}Please, input your password below to proceed to the game.\n\n", pInfo[playerid][Name]);
122 ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Welcome Back!", String, "Login", "Leave");
123 }
124 }
125 }
126 case DIALOG_AGE:
127 {
128 if(!response) return Kick(playerid);
129
130 if(inputtext[playerid] < 18 || inputtext[playerid] > 50)
131
132 {
133
134 SCM(playerid, 0x969696FF, "Invalid AGE length, should be 18 - 50.");
135
136 new Integer[100];
137
138 format(Integer, sizeof(Integer), "{FFFFFF}Welcome %s.\n\n {0099FF}Please, input your age below to proceed.\n\n", pInfo[playerid][Name]);
139 ShowPlayerDialog(playerid, DIALOG_AGE, DIALOG_STYLE_INPUT, "Account Registration - Age", Integer, "Proceed", "Leave");
140 }
141 else
142 {
143 pInfo[playerid][Age] = strlen(inputtext);
144 new String[50];
145
146 format(String, sizeof(String), "{FFFFFF}Welcome %s.\n\n {0099FF}Please, input your gender below to proceed. (1 - MALE || 2 - FEMALE) || 3 - OTHER\n\n", pInfo[playerid][Name]);
147 ShowPlayerDialog(playerid, DIALOG_GENDER, DIALOG_STYLE_INPUT, "Account Registration - Gender", String, "Proceed", "Leave");
148 }
149 }
150 case DIALOG_GENDER:
151 {
152 if(!response) return Kick(playerid);
153
154 if(!strcmp(inputtext, "MALE", false) || !strcmp(inputtext, "FEMALE", false) || !strcmp(inputtext,"OTHER", false))
155
156 {
157 new String[50];
158
159 format(String, sizeof(String), "{FFFFFF}Welcome %s.\n\n {0099FF}Please, input your gender below to proceed. (1 - MALE || 2 - FEMALE) || 3 - OTHER\n\n", pInfo[playerid][Name]);
160 ShowPlayerDialog(playerid, DIALOG_GENDER, DIALOG_STYLE_INPUT, "Account Registration - Gender", String, "Proceed", "Leave");
161 SendClientMessage(playerid, -1, " Please type: MALE OR FEMALE OR OTHER");
162 return 1;
163 }
164
165 {
166 strcpy(pInfo[playerid][Gender], inputtext, 10);
167
168 switch(pInfo[playerid][Gender])
169
170 {
171 case 1: pInfo[playerid][Skin] = 250;
172 case 2: pInfo[playerid][Skin] = 191;
173 case 3: pInfo[playerid][Skin] = 0;
174 }
175
176 new DB_Query[325], String[100];
177 format(String, sizeof(String), " Alright, You've choosen Gender as %s", GetPlayerGender(playerid));
178 mysql_format(Database, DB_Query, sizeof(DB_Query), "INSERT INTO `PLAYERS` (`USERNAME`, `PASSWORD`, `SALT`, `SCORE`, `KILLS`, `CASH`, `DEATHS`, `AGE`, `GENDER`, `SKIN`)\
179 VALUES ('%e', '%s', '%e', '20', '0', '0', '0', %i, %i, %i)", pInfo[playerid][Name], pInfo[playerid][Password], pInfo[playerid][Salt], pInfo[playerid][Age], pInfo[playerid][Gender], pInfo[playerid][Skin]);
180 mysql_tquery(Database, DB_Query, "OnPlayerRegister", "d", playerid);
181
182 }
183 }
184 case DIALOG_REGISTER:
185 {
186 if(!response) return Kick(playerid);
187
188 if(strlen(inputtext) <= 5 || strlen(inputtext) > 60)
189 {
190
191 SCM(playerid, 0x969696FF, "Invalid password length, should be 5 - 60.");
192
193 new String[150];
194
195 format(String, sizeof(String), "{FFFFFF}Welcome %s.\n\n{0099FF}This account is not registered.\n\
196 {0099FF}Please, input your password below to proceed.\n\n", pInfo[playerid][Name]);
197 ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Account Registration", String, "Register", "Leave");
198 }
199 else
200 {
201 for (new i = 0; i < 10; i++)
202 {
203 pInfo[playerid][Salt][i] = random(79) + 47;
204 }
205
206 pInfo[playerid][Salt][10] = 0;
207 SHA256_PassHash(inputtext, pInfo[playerid][Salt], pInfo[playerid][Password], 65);
208
209 new Integer[100];
210
211 format(Integer, sizeof(Integer), "{FFFFFF}Welcome %s.\n\n {0099FF}Please, input your age below to proceed.\n\n", pInfo[playerid][Name]);
212 ShowPlayerDialog(playerid, DIALOG_AGE, DIALOG_STYLE_INPUT, "Account Registration - AGE", Integer, "Proceed", "Leave");
213 }
214 }
215 }
216 return 1;
217}
218
219
220forward OnPlayerDataCheck(playerid, corrupt_check);
221public OnPlayerDataCheck(playerid, corrupt_check)
222{
223 if (corrupt_check != Corrupt_Check[playerid]) return Kick(playerid);
224
225 new String[150];
226
227 if(cache_num_rows() > 0)
228 {
229
230 cache_get_value(0, "PASSWORD", pInfo[playerid][Password], 65);
231 cache_get_value(0, "SALT", pInfo[playerid][Salt], 11);
232
233 pInfo[playerid][Player_Cache] = cache_save();
234
235 format(String, sizeof(String), "{FFFFFF}Welcome back, %s.\n\n{0099FF}This account is already registered.\n\
236 {0099FF}Please, input your password below to proceed to the game.\n\n", pInfo[playerid][Name]);
237 ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Welcome Back!", String, "Login", "Leave");
238 }
239 else
240 {
241 format(String, sizeof(String), "{FFFFFF}Welcome %s.\n\n{0099FF}This account is not registered.\n\
242 {0099FF}Please, input your password below to proceed to the game.\n\n", pInfo[playerid][Name]);
243 ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Account Registration", String, "Register", "Leave");
244 }
245 return 1;
246}
247
248
249forward OnPlayerRegister(playerid);
250public OnPlayerRegister(playerid)
251{
252 SetSpawnInfo(playerid, 0, 250, 1444.0865, -2286.6409, 15.3960, -269.1425, 0, 0, 0, 0, 0, 0);
253 GivePlayerMoney(playerid, 500);
254 SCM(playerid, 0xFFFFFFFF, "Welcome to {0099FF}Neo City Roleplay!");
255 pInfo[playerid][LoggedIn] = true;
256 return 1;
257}