· 8 years ago · Mar 27, 2018, 09:48 AM
1/*
2
3 _____ ___ _ _____ _ _
4/ ___| / _ \ | | |_ _| | | (_)
5\ `--. __ _ _ __ / /_\ \_ __ __| |_ __ ___ __ _ ___ | |_ __ _ _ ___| | ___ _ __ __ _
6 `--. \/ _` | '_ \ | _ | '_ \ / _` | '__/ _ \/ _` / __| | | '__| | | |/ __| |/ / | '_ \ / _` |
7/\__/ / (_| | | | | | | | | | | | (_| | | | __/ (_| \__ \ | | | | |_| | (__| <| | | | | (_| |
8\____/ \__,_|_| |_| \_| |_/_| |_|\__,_|_| \___|\__,_|___/ \_/_| \__,_|\___|_|\_\_|_| |_|\__, |
9 __/ |
10 |___/
11Auteur: Foobar
12Description:Un mode de jeu "Routier" et seulement routier. Étant un partisan de ce mode et aillant commencer
13SA:MP sur ce mode je décide de continuer l'avancement du projet débuter et annoncer en 2015 sur le forum
14officiel SA:MP. Le mode ce rapprochera un maximum de ETS 2. Peu original mais j'ai tout de même envie
15de donner vie à ce projet qui me tient à coeur même si SA:MP n'a plus la même notoriété.
16
17Crédits:
18-YSI-includes par Misiur.
19-Mysql R1-2 par maddinat0r.
20-C_far.
21-http://forum.sa-mp.com/.
22-https://sa-mp-fr.com/.
23
24*/
25
26#pragma compat 1
27
28#include <a_samp>
29#include <a_mysql>
30
31/* Includes YSI_ utiliser pour le fonctionnement du gamemode */
32
33#include <YSI\y_iterate>
34#include <YSI\y_commands>
35#include <YSI\y_master>
36
37/* Vos identifiants de connexion à votre base de donnée */
38
39#define MYSQL_HOST "127.0.0.1"
40#define MYSQL_USER "root"
41#define MYSQL_PASS ""
42#define MYSQL_DATABASE "sat"
43
44#define DIALOG_REGISTER (0)
45#define DIALOG_LOGIN (1)
46
47
48main() {}
49new MySQL: Database, Corrupt_Check[MAX_PLAYERS];
50
51
52
53//======================================ENUMERATION DES STATS DU JOUEURS=====================================
54
55enum ENUM_PLAYER_DATA
56{
57 ID,
58 Name[25],
59
60 Password[65],
61 Salt[11],
62
63 PasswordFails,
64
65 Kills,
66 Deaths,
67
68 Score,
69 Cash,
70
71 Cache: Player_Cache,
72 bool:LoggedIn
73}
74
75new pInfo[MAX_PLAYERS][ENUM_PLAYER_DATA];
76
77//=====================================MYSQL CONNEXION/INSCRIPTION===========================================
78
79public OnGameModeInit()
80{
81 CreateVehicle(403, 94.0300, -278.4021, 2.0651, 0.0000, -1, -1, 100);
82 CreateVehicle(403, 90.0537, -278.3176, 2.0651, 0.0000, -1, -1, 100);
83 CreateVehicle(403, 86.2468, -278.3863, 2.0651, 0.0000, -1, -1, 100);
84 new MySQLOpt: option_id = mysql_init_options();
85 mysql_set_option(option_id, AUTO_RECONNECT, true);
86
87 Database = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_DATABASE, option_id);
88 if(Database == MYSQL_INVALID_HANDLE || mysql_errno(Database) != 0)
89 {
90 print("Erreur pendant la connexion, fermeture.");
91
92 SendRconCommand("exit");
93 return 1;
94 }
95
96 print("Connexion réussi. Connexion à la base de donnée réussi.");
97
98 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`))");
99
100 return 1;
101}
102
103public OnGameModeExit()
104{
105 foreach(new i: Player)
106 {
107 if(IsPlayerConnected(i))
108 {
109 OnPlayerDisconnect(i, 1);
110 }
111 }
112
113 mysql_close(Database);
114 return 1;
115}
116
117public OnPlayerConnect(playerid)
118{
119 new DB_Query[115];
120
121
122 pInfo[playerid][Kills] = 0;
123 pInfo[playerid][Deaths] = 0;
124 pInfo[playerid][PasswordFails] = 0;
125
126 GetPlayerName(playerid, pInfo[playerid][Name], MAX_PLAYER_NAME);
127 Corrupt_Check[playerid]++;
128
129 mysql_format(Database, DB_Query, sizeof(DB_Query), "SELECT * FROM `PLAYERS` WHERE `USERNAME` = '%e' LIMIT 1", pInfo[playerid][Name]);
130 mysql_tquery(Database, DB_Query, "OnPlayerDataCheck", "ii", playerid, Corrupt_Check[playerid]);
131 return 1;
132}
133
134public OnPlayerDisconnect(playerid, reason)
135{
136 Corrupt_Check[playerid]++;
137
138 new DB_Query[256];
139
140 mysql_format(Database, DB_Query, sizeof(DB_Query), "UPDATE `PLAYERS` SET `SCORE` = %d, `CASH` = %d, `KILLS` = %d, `DEATHS` = %d WHERE `ID` = %d LIMIT 1",
141 pInfo[playerid][Score], pInfo[playerid][Cash], pInfo[playerid][Kills], pInfo[playerid][Deaths], pInfo[playerid][ID]);
142
143 mysql_tquery(Database, DB_Query);
144
145 if(cache_is_valid(pInfo[playerid][Player_Cache]))
146 {
147 cache_delete(pInfo[playerid][Player_Cache]);
148 pInfo[playerid][Player_Cache] = MYSQL_INVALID_CACHE;
149 }
150
151 pInfo[playerid][LoggedIn] = false;
152 print("OnPlayerDisconnect a été appelé.");
153 return 1;
154}
155
156public OnPlayerDeath(playerid, killerid, reason)
157{
158 if(killerid != INVALID_PLAYER_ID)
159 {
160 pInfo[killerid][Kills]++;
161 pInfo[playerid][Deaths]++;
162 }
163 return 1;
164}
165
166public OnPlayerRequestSpawn(playerid)
167{
168 if(pInfo[playerid][LoggedIn] == false) return 0;
169 return 1;
170}
171public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
172{
173 switch (dialogid)
174 {
175 case DIALOG_LOGIN:
176 {
177 if(!response) return Kick(playerid);
178
179 new Salted_Key[65];
180 SHA256_PassHash(inputtext, pInfo[playerid][Salt], Salted_Key, 65);
181
182 if(strcmp(Salted_Key, pInfo[playerid][Password]) == 0)
183 {
184
185 cache_set_active(pInfo[playerid][Player_Cache]);
186 cache_get_value_int(0, "ID", pInfo[playerid][ID]);
187
188 cache_get_value_int(0, "KILLS", pInfo[playerid][Kills]);
189 cache_get_value_int(0, "DEATHS", pInfo[playerid][Deaths]);
190
191 cache_get_value_int(0, "SCORE", pInfo[playerid][Score]);
192 cache_get_value_int(0, "CASH", pInfo[playerid][Cash]);
193
194 SetPlayerScore(playerid, pInfo[playerid][Score]);
195
196 ResetPlayerMoney(playerid);
197 GivePlayerMoney(playerid, pInfo[playerid][Cash]);
198
199 cache_delete(pInfo[playerid][Player_Cache]);
200 pInfo[playerid][Player_Cache] = MYSQL_INVALID_CACHE;
201
202 pInfo[playerid][LoggedIn] = true;
203 SendClientMessage(playerid, 0x00FF00FF, "Vous êtes connecté.");
204 TogglePlayerSpectating(playerid, false);
205 }
206 else
207 {
208 new String[150];
209
210 pInfo[playerid][PasswordFails] += 1;
211 printf("%s has been failed to login. (%d)", pInfo[playerid][Name], pInfo[playerid][PasswordFails]);
212
213 if (pInfo[playerid][PasswordFails] >= 3)
214 {
215 format(String, sizeof(String), "%s a été expulsé: Essai {FF0000}(%d/3).", pInfo[playerid][Name], pInfo[playerid][PasswordFails]);
216 SendClientMessageToAll(0x969696FF, String);
217 Kick(playerid);
218 }
219 else
220 {
221 format(String, sizeof(String), "Mauvais mot de passe, il vous reste %d essai sur 3.", pInfo[playerid][PasswordFails]);
222 SendClientMessage(playerid, 0xFF0000FF, String);
223
224 format(String, sizeof(String), "{FFFFFF}Bon retour parmis nous, %s.\n\n{0099FF} Tu es déjà enregistré passe un bon moment sur le serveur.\n\
225 {0099FF}Taper votre mot de passe ci-dessous.\n\n", pInfo[playerid][Name]);
226 ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Connexion", String, "Valider", "Quitter");
227 }
228 }
229 }
230 case DIALOG_REGISTER:
231 {
232 if(!response) return Kick(playerid);
233
234 if(strlen(inputtext) <= 5 || strlen(inputtext) > 60)
235 {
236 SendClientMessage(playerid, 0x969696FF, "Votre mot de passe dois contenir 5 charactère minimum et 60 maximum.");
237
238 new String[150];
239
240 format(String, sizeof(String), "{FFFFFF}Bienvenue %s.\n\n{0099FF}Enregistré vous maintenant.\n\
241 {0099FF}Entrer votre mot de passe pour continuer.\n\n", pInfo[playerid][Name]);
242 ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Inscription", String, "Valider", "Quitter");
243 }
244 else
245 {
246
247 for (new i = 0; i < 10; i++)
248 {
249 pInfo[playerid][Salt][i] = random(79) + 47;
250 }
251
252 pInfo[playerid][Salt][10] = 0;
253 SHA256_PassHash(inputtext, pInfo[playerid][Salt], pInfo[playerid][Password], 65);
254
255 new DB_Query[225];
256
257 mysql_format(Database, DB_Query, sizeof(DB_Query), "INSERT INTO `PLAYERS` (`USERNAME`, `PASSWORD`, `SALT`, `SCORE`, `KILLS`, `CASH`, `DEATHS`)\
258 VALUES ('%e', '%s', '%e', '0', '0', '0', '0')", pInfo[playerid][Name], pInfo[playerid][Password], pInfo[playerid][Salt]);
259 mysql_tquery(Database, DB_Query, "OnPlayerRegister", "d", playerid);
260 }
261 }
262 }
263 return 1;
264}
265
266forward public OnPlayerDataCheck(playerid, corrupt_check);
267public OnPlayerDataCheck(playerid, corrupt_check)
268{
269 if (corrupt_check != Corrupt_Check[playerid]) return Kick(playerid);
270
271 new String[150];
272
273 if(cache_num_rows() > 0)
274 {
275
276 cache_get_value(0, "PASSWORD", pInfo[playerid][Password], 65);
277 cache_get_value(0, "SALT", pInfo[playerid][Salt], 11);
278
279 pInfo[playerid][Player_Cache] = cache_save();
280
281 format(String, sizeof(String), "{FFFFFF}Bon retour, %s.\n\n{0099FF}Votre compte est déjà enregistrer.\n\
282 {0099FF}Taper votre mot de passe ci-dessous.\n\n", pInfo[playerid][Name]);
283 ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Connexion", String, "Valider", "Quitter");
284 }
285 else
286 {
287 format(String, sizeof(String), "{FFFFFF}Bienvenue %s.\n\n{0099FF}Vous pouvez passer à l'inscription.\n\
288 {0099FF}Taper votre mot de passe ci-dessous.\n\n", pInfo[playerid][Name]);
289 ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Inscription", String, "Valider", "Quitter");
290 }
291 return 1;
292}
293
294forward public OnPlayerRegister(playerid);
295public OnPlayerRegister(playerid)
296{
297 SendClientMessage(playerid, 0x00FF00FF, "Vous êtes maintenant inscrit et connecté.");
298 pInfo[playerid][LoggedIn] = true;
299 return 1;
300}
301//=================================FIN DU SYSTEME D'INSCRIPTION/CONNEXION===================================
302public OnPlayerRequestClass(playerid, classid)
303{
304 SetSpawnInfo( playerid, 0, 0, 136.2006, -268.5917, 1.5781, 120.7078, 26, 36, 28, 150, 0, 0 );
305 TogglePlayerSpectating(playerid, true);
306 return true;
307}
308CMD:aide(playerid, params[])
309{
310 SendClientMessage(playerid, 0xFF0000AA, "Aucune aide disponible.");
311 return 1;
312}