· 8 years ago · Mar 29, 2018, 10:56 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#include <colors>
37
38/* Vos identifiants de connexion à votre base de donnée */
39
40#define MYSQL_HOST "127.0.0.1"
41#define MYSQL_USER "root"
42#define MYSQL_PASS ""
43#define MYSQL_DATABASE "sat"
44
45#define DIALOG_REGISTER (0)
46#define DIALOG_LOGIN (1)
47#define DIALOG_EMPLOI (2)
48
49#define PRESSED(%0) \
50 (((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))
51
52main() {}
53new MySQL: Database, Corrupt_Check[MAX_PLAYERS];
54
55//======================================ENUMERATION DES STATS DU JOUEURS=====================================
56
57enum ENUM_PLAYER_DATA
58{
59 ID,
60 Name[25],
61
62 Password[65],
63 Salt[11],
64
65 PasswordFails,
66
67 Kills,
68 Deaths,
69
70 Score,
71 Cash,
72
73 Cache: Player_Cache,
74 bool:LoggedIn
75}
76
77new pInfo[MAX_PLAYERS][ENUM_PLAYER_DATA];
78
79//=====================================MYSQL CONNEXION/INSCRIPTION===========================================
80
81public OnGameModeInit()
82{
83 //Pickup
84 Create3DTextLabel("Emploi (CTRL)", 0x008080FF, 130.8483,-301.1949, 2.3000, 40.0, 0, 0);
85 CreatePickup(1239, 1, 130.8483, -301.1949, 1.5781);
86 // Mapping
87 CreateObject(19486, 130.18767, -305.21594, 3.22380, 0.00000, 0.00000, 90.70000);
88
89 SetGameModeText("Trucking v1.0");
90 //Tracteur
91 CreateVehicle(403, 94.0300, -278.4021, 2.0651, 0.0000, -1, -1, 100);
92 CreateVehicle(403, 90.0537, -278.3176, 2.0651, 0.0000, -1, -1, 100);
93 CreateVehicle(403, 86.2468, -278.3863, 2.0651, 0.0000, -1, -1, 100);
94 //Remorque
95 CreateVehicle(450, -19.1345, -275.9944, 5.9241, 180.5750, -1, -1, 100);
96 CreateVehicle(584, -13.9820, -275.7437, 6.4045, -181.0680, -1, -1, 100);
97 CreateVehicle(435, -8.6393, -276.1291, 5.9330, 179.4040, -1, -1, 100);
98
99 new MySQLOpt: option_id = mysql_init_options();
100 mysql_set_option(option_id, AUTO_RECONNECT, true);
101
102 Database = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_DATABASE, option_id);
103 if(Database == MYSQL_INVALID_HANDLE || mysql_errno(Database) != 0)
104 {
105 print("Erreur pendant la connexion, fermeture.");
106
107 SendRconCommand("exit");
108 return 1;
109 }
110
111 print("Connexion réussi. Connexion à la base de donnée réussi.");
112
113 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`))");
114
115 return 1;
116}
117
118public OnGameModeExit()
119{
120 foreach(new i: Player)
121 {
122 if(IsPlayerConnected(i))
123 {
124 OnPlayerDisconnect(i, 1);
125 }
126 }
127
128 mysql_close(Database);
129 return 1;
130}
131
132public OnPlayerConnect(playerid)
133{
134 RemoveBuildingForPlayer(playerid, 13194, 140.5938, -305.3906, 5.5938, 0.25);
135 RemoveBuildingForPlayer(playerid, 13198, 140.5938, -305.3906, 5.5938, 0.25);
136 new DB_Query[115];
137
138
139 pInfo[playerid][Kills] = 0;
140 pInfo[playerid][Deaths] = 0;
141 pInfo[playerid][PasswordFails] = 0;
142
143 GetPlayerName(playerid, pInfo[playerid][Name], MAX_PLAYER_NAME);
144 Corrupt_Check[playerid]++;
145
146 mysql_format(Database, DB_Query, sizeof(DB_Query), "SELECT * FROM `PLAYERS` WHERE `USERNAME` = '%e' LIMIT 1", pInfo[playerid][Name]);
147 mysql_tquery(Database, DB_Query, "OnPlayerDataCheck", "ii", playerid, Corrupt_Check[playerid]);
148 return 1;
149}
150
151public OnPlayerDisconnect(playerid, reason)
152{
153 Corrupt_Check[playerid]++;
154
155 new DB_Query[256];
156
157 mysql_format(Database, DB_Query, sizeof(DB_Query), "UPDATE `PLAYERS` SET `SCORE` = %d, `CASH` = %d, `KILLS` = %d, `DEATHS` = %d WHERE `ID` = %d LIMIT 1",
158 pInfo[playerid][Score], pInfo[playerid][Cash], pInfo[playerid][Kills], pInfo[playerid][Deaths], pInfo[playerid][ID]);
159
160 mysql_tquery(Database, DB_Query);
161
162 if(cache_is_valid(pInfo[playerid][Player_Cache]))
163 {
164 cache_delete(pInfo[playerid][Player_Cache]);
165 pInfo[playerid][Player_Cache] = MYSQL_INVALID_CACHE;
166 }
167
168 pInfo[playerid][LoggedIn] = false;
169 print("OnPlayerDisconnect a été appelé.");
170 return 1;
171}
172
173public OnPlayerDeath(playerid, killerid, reason)
174{
175 if(killerid != INVALID_PLAYER_ID)
176 {
177 pInfo[killerid][Kills]++;
178 pInfo[playerid][Deaths]++;
179 }
180 return 1;
181}
182
183public OnPlayerRequestSpawn(playerid)
184{
185 if(pInfo[playerid][LoggedIn] == false) return 0;
186 return 1;
187}
188public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
189{
190
191 switch (dialogid)
192 {
193 case DIALOG_EMPLOI:
194 {
195 if(response)
196 {
197 SendClientMessage(playerid, COLOR_GREEN, "Vous avez selectionner une mission aller dans la coure récupérer un camion.");
198 }
199 else
200 {
201 SendClientMessage(playerid, COLOR_RED, "Vous avez sélectionner aucune mission.");
202 }
203 return 1;
204 }
205 case DIALOG_LOGIN:
206 {
207 if(!response) return Kick(playerid);
208
209 new Salted_Key[65];
210 SHA256_PassHash(inputtext, pInfo[playerid][Salt], Salted_Key, 65);
211
212 if(strcmp(Salted_Key, pInfo[playerid][Password]) == 0)
213 {
214
215 cache_set_active(pInfo[playerid][Player_Cache]);
216 cache_get_value_int(0, "ID", pInfo[playerid][ID]);
217
218 cache_get_value_int(0, "KILLS", pInfo[playerid][Kills]);
219 cache_get_value_int(0, "DEATHS", pInfo[playerid][Deaths]);
220
221 cache_get_value_int(0, "SCORE", pInfo[playerid][Score]);
222 cache_get_value_int(0, "CASH", pInfo[playerid][Cash]);
223
224 SetPlayerScore(playerid, pInfo[playerid][Score]);
225
226 ResetPlayerMoney(playerid);
227 GivePlayerMoney(playerid, pInfo[playerid][Cash]);
228
229 cache_delete(pInfo[playerid][Player_Cache]);
230 pInfo[playerid][Player_Cache] = MYSQL_INVALID_CACHE;
231
232 pInfo[playerid][LoggedIn] = true;
233 SendClientMessage(playerid, 0x00FF00FF, "Vous êtes connecté.");
234 TogglePlayerSpectating(playerid, false);
235
236 }
237 else
238 {
239 new String[150];
240
241 pInfo[playerid][PasswordFails] += 1;
242 printf("%s has been failed to login. (%d)", pInfo[playerid][Name], pInfo[playerid][PasswordFails]);
243
244 if (pInfo[playerid][PasswordFails] >= 3)
245 {
246 format(String, sizeof(String), "%s a été expulsé: Essai {FF0000}(%d/3).", pInfo[playerid][Name], pInfo[playerid][PasswordFails]);
247 SendClientMessageToAll(0x969696FF, String);
248 Kick(playerid);
249 }
250 else
251 {
252 format(String, sizeof(String), "Mauvais mot de passe, il vous reste %d essai sur 3.", pInfo[playerid][PasswordFails]);
253 SendClientMessage(playerid, 0xFF0000FF, String);
254
255 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\
256 {0099FF}Taper votre mot de passe ci-dessous.\n\n", pInfo[playerid][Name]);
257 ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Connexion", String, "Valider", "Quitter");
258 }
259 }
260 }
261 case DIALOG_REGISTER:
262 {
263 if(!response) return Kick(playerid);
264
265 if(strlen(inputtext) <= 5 || strlen(inputtext) > 60)
266 {
267 SendClientMessage(playerid, 0x969696FF, "Votre mot de passe dois contenir 5 charactère minimum et 60 maximum.");
268
269 new String[150];
270
271 format(String, sizeof(String), "{FFFFFF}Bienvenue %s.\n\n{0099FF}Enregistré vous maintenant.\n\
272 {0099FF}Entrer votre mot de passe pour continuer.\n\n", pInfo[playerid][Name]);
273 ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Inscription", String, "Valider", "Quitter");
274 }
275 else
276 {
277
278 for (new i = 0; i < 10; i++)
279 {
280 pInfo[playerid][Salt][i] = random(79) + 47;
281 }
282
283 pInfo[playerid][Salt][10] = 0;
284 SHA256_PassHash(inputtext, pInfo[playerid][Salt], pInfo[playerid][Password], 65);
285
286 new DB_Query[225];
287
288 mysql_format(Database, DB_Query, sizeof(DB_Query), "INSERT INTO `PLAYERS` (`USERNAME`, `PASSWORD`, `SALT`, `SCORE`, `KILLS`, `CASH`, `DEATHS`)\
289 VALUES ('%e', '%s', '%e', '0', '0', '0', '0')", pInfo[playerid][Name], pInfo[playerid][Password], pInfo[playerid][Salt]);
290 mysql_tquery(Database, DB_Query, "OnPlayerRegister", "d", playerid);
291 }
292 }
293 }
294 return 1;
295}
296
297forward public OnPlayerDataCheck(playerid, corrupt_check);
298public OnPlayerDataCheck(playerid, corrupt_check)
299{
300 if (corrupt_check != Corrupt_Check[playerid]) return Kick(playerid);
301
302 new String[150];
303
304 if(cache_num_rows() > 0)
305 {
306
307 cache_get_value(0, "PASSWORD", pInfo[playerid][Password], 65);
308 cache_get_value(0, "SALT", pInfo[playerid][Salt], 11);
309
310 pInfo[playerid][Player_Cache] = cache_save();
311
312 format(String, sizeof(String), "{FFFFFF}Bon retour, %s.\n\n{0099FF}Votre compte est déjà enregistrer.\n\
313 {0099FF}Taper votre mot de passe ci-dessous.\n\n", pInfo[playerid][Name]);
314 ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Connexion", String, "Valider", "Quitter");
315 }
316 else
317 {
318 format(String, sizeof(String), "{FFFFFF}Bienvenue %s.\n\n{0099FF}Vous pouvez passer à l'inscription.\n\
319 {0099FF}Taper votre mot de passe ci-dessous.\n\n", pInfo[playerid][Name]);
320 ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Inscription", String, "Valider", "Quitter");
321 }
322 return 1;
323}
324
325forward public OnPlayerRegister(playerid);
326public OnPlayerRegister(playerid)
327{
328 SendClientMessage(playerid, 0x00FF00FF, "Vous êtes maintenant inscrit et connecté.");
329 pInfo[playerid][LoggedIn] = true;
330 SpawnPlayer(playerid);
331 return 1;
332}
333//=================================FIN DU SYSTEME D'INSCRIPTION/CONNEXION===================================
334public OnPlayerRequestClass(playerid, classid)
335{
336 SetSpawnInfo( playerid, 0, 6, 136.2006, -268.5917, 1.5781, 120.7078, 0, 0, 0, 0, 0, 0 );
337 SpawnPlayer(playerid);
338 return 1;
339}
340public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
341{
342 if (PRESSED(KEY_FIRE))
343 {
344 if (IsPlayerInRangeOfPoint(playerid, 7.0, 130.8483, -301.1949, 1.5781))
345 {
346 ShowPlayerDialog(playerid, DIALOG_EMPLOI, DIALOG_STYLE_TABLIST, "Emploi", "Sable\t$5000\t100p\nFer\t$5000\t100p\nLait\t$1000\t50", "Prendre", "Quitter");
347 }
348 }
349 return 1;
350}
351public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
352{
353
354}
355
356//Les commmandes
357CMD:aide(playerid, params[])
358{
359 SendClientMessage(playerid, 0xFF0000AA, "Aucune aide disponible.");
360 return 1;
361}