· 9 years ago · Dec 23, 2016, 03:44 PM
1/**************************************************************************/
2// MySQL Simple Registration System
3/*************************************************************************/
4/**************************************************************************/
5// Version 1.0 | Build 1
6/*************************************************************************/
7/**
8 * Copyright (c) 2015-2016 San Andreas Playground
9 *
10 * This program is free software: you can redistribute it and/or modify it under the terms of the
11 * GNU General Public License as published by the Free Software Foundation, either version 3 of the
12 * License, or (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
15 * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License along with this program.
19 * If not, see <http://www.gnu.org/licenses/>.
20 */
21
22 /*AUTHOR ********************
23 @Yaa - SA-MP Lead Scripter
24 ***************************/
25 /* WARNINGS: **********************************************************
26 1- This script can be used just by GabixX isn't Open Sourced Yet !
27 2- This Script Work only with MySQL +R40 and MySQL Server +8.0
28 3- Don't re-post it on SA-MP Forum you don't have permission to do that
29 ***********************************************************************/
30
31 /* How to Create a admin command *************************
32
33 You need only to do this :
34
35 CMD:[cmdname](playerid, params[])
36 {
37 if(PlayerInfo[playerid][pAdmin] == LEVEL NUMBER) or if(PlayerInfo[playerid][pAdmin] >= LEVEL NUMBER)
38
39 Do something here ...
40
41 return 1;
42 }
43
44 ***********************************************************/
45
46// Includes ========================================================================================
47
48#include <a_samp>
49#include <a_mysql>
50#include <zcmd>
51#include <sscanf2>
52
53// Defines =========================================================================================
54
55#define MYSQL_HOST "" // free db ? use mysql8.db4free.net
56#define MYSQL_USER ""
57#define MYSQL_DATABSE ""
58#define MYSQL_PASSWORD ""
59#define MYSQL_PORT 3306 // are you using mysql8.db4free.net ? change this to 3304 if you do
60
61#define G "{6EF83C}"
62#define R "{F81414}"
63#define W "{FFFFFF}"
64#define O "{FFAF00}"
65#define YE "{FFFF00}"
66#define GRI "{C0C0C0}"
67
68#define MAX_VIP_LEVEL 3
69#define MAX_ADMIN_LEVEL 5
70#define MANAGER_LEVEL 6 // this value need to be MAX_ADMIN_LEVEL + 1
71
72// Forwards ========================================================================================
73
74forward OnMySQLInit(playerid);
75forward OnMySQLValided(playerid);
76forward OnMySQLRegister(playerid);
77
78// Static ==========================================================================================
79
80static MySQL:register;
81
82// Natives =========================================================================================
83
84native WP_Hash(buffer[], len, const str[]);
85
86// Variables =======================================================================================
87
88enum
89{
90 Login,
91 Register
92};
93
94enum Player
95{
96 ID,
97 Name[MAX_PLAYER_NAME],
98 Password[129],
99 IP[16],
100 Admin,
101 VIP,
102 Money
103};
104
105new PlayerInfo[MAX_PLAYERS][Player];
106
107// Script Config ===================================================================================
108
109public OnGameModeInit()
110{
111 new MySQLOpt:options = mysql_init_options();
112
113 mysql_set_option(options, SERVER_PORT, MYSQL_PORT);
114 mysql_log(ALL);
115 register = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABSE, options);
116 if(mysql_errno() != 0)
117 {
118 printf("[MySQL Connection]: The connection to Database `%s` has failed.", MYSQL_DATABSE);
119 printf("[MySQL Notice]: Cannot Create `accounts` table on database `%s`", MYSQL_DATABSE);
120 }
121 else
122 {
123 printf("[MySQL Connection]: The connection to Database `%s` was successful.", MYSQL_DATABSE);
124 mysql_query(register, "CREATE TABLE IF NOT EXISTS `accounts` ( `ID` VARCHAR(20), `Name` VARCHAR(64), `Password` VARCHAR(129), `IP` VARCHAR(20), `Admin` INT(20), `VIP` INT(20), `Money` INT(50) )");
125 printf("[MySQL Notice]: Table `accounts` created on database `%s` ! ", MYSQL_DATABSE);
126 }
127 return true;
128}
129
130public OnPlayerConnect(playerid)
131{
132
133 TogglePlayerSpectating(playerid, true);
134 new
135 query[128],
136 playername[MAX_PLAYER_NAME];
137
138 GetPlayerName(playerid, playername, sizeof(playername));
139 mysql_format(register, query, sizeof(query), "SELECT `Password`, `ID` FROM `accounts` WHERE `Name` = '%s' LIMIT 1", playername);
140 mysql_tquery(register, query, "OnMySQLInit", "i", playerid);
141 return 1;
142}
143
144public OnPlayerDisconnect(playerid, reason)
145{
146 new
147 query[128],
148 Float:pos[4];
149
150 GetPlayerPos(playerid, pos[0], pos[1], pos[2]);
151 GetPlayerFacingAngle(playerid, pos[3]);
152
153 mysql_format(register, query, sizeof(query), "UPDATE `accounts` SET `Money` = %d WHERE `ID` = %d", GetPlayerMoney(playerid), PlayerInfo[playerid][ID]);
154 mysql_query(register, query);
155 return true;
156}
157
158public OnMySQLInit(playerid)
159{
160 new
161 rows,
162 fields;
163
164 cache_get_row_count(rows);
165 cache_get_field_count(fields);
166
167 if(rows)
168 {
169 cache_get_value_name(0, "Password", PlayerInfo[playerid][Password]);
170
171 cache_get_value_name(0, "ID", PlayerInfo[playerid][ID]);
172 ShowPlayerDialog(playerid, Login, DIALOG_STYLE_INPUT, "Login", "Welcome !\nthis account already registred. Please fill in your password:", "Login", "Quit");
173 }
174 else
175 {
176 ShowPlayerDialog(playerid, Register, DIALOG_STYLE_INPUT, "Register", "Welcome player!\nYour account has not been registered yet. Please fill in your desired password:", "Register", "Quit");
177 }
178 return true;
179}
180
181public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
182{
183 switch(dialogid)
184 {
185 case Login:
186 {
187 if(!response) Kick(playerid);
188
189 new
190 hashpass[129],
191 query[100],
192 playername[MAX_PLAYER_NAME];
193
194 GetPlayerName(playerid, playername, sizeof(playername));
195 WP_Hash(hashpass, sizeof(hashpass), inputtext);
196 if(!strcmp(hashpass, PlayerInfo[playerid][Password]))
197 {
198 mysql_format(register, query, sizeof(query), "SELECT * FROM `accounts` WHERE `Name` = '%e' LIMIT 1", playername);
199 mysql_tquery(register, query, "OnMySQLValided", "i", playerid);
200 }
201 else
202 {
203 SendClientMessage(playerid, -1, "You have specified an incorrect password!");
204 ShowPlayerDialog(playerid, Login, DIALOG_STYLE_INPUT, "Login", "Welcome !\nthis account already registred. Please fill in your password:", "Login", "Quit");
205 }
206 }
207 case Register:
208 {
209 if(!response) return Kick(playerid);
210 if(strlen(inputtext) < 5)
211 {
212 SendClientMessage(playerid, -1, "Your password must at least contain more than 4 characters.");
213 return ShowPlayerDialog(playerid, Register, DIALOG_STYLE_INPUT, "Register", "Welcome !\nYour account has not been registered yet. Please fill in your desired password:", "Register", "Quit");
214 }
215 new
216 query[512],
217 playername[MAX_PLAYER_NAME],
218 playerip[16];
219
220
221 GetPlayerName(playerid, playername, sizeof(playername));
222 GetPlayerIp(playerid, playerip, sizeof(playerip));
223 WP_Hash(PlayerInfo[playerid][Password], 129, inputtext);
224 mysql_format(register, query, sizeof(query), "INSERT INTO `accounts` (`Name`, `Password`, `IP`, `Admin`, `VIP`, `Money`) VALUES ('%e', '%e', '%e', 0, 0, 0)", playername, PlayerInfo[playerid][Password], playerip);
225 mysql_tquery(register, query, "OnMySQLRegister", "i", playerid);
226 }
227 }
228 return 0;
229}
230public OnMySQLValided(playerid)
231{
232 cache_get_value_name(0, "Admin", PlayerInfo[playerid][Admin]);
233 cache_get_value_name(0, "VIP", PlayerInfo[playerid][VIP]);
234 cache_get_value_name(0, "Money", PlayerInfo[playerid][Money]);
235
236 TogglePlayerSpectating(playerid, false);
237
238 GivePlayerMoney(playerid, PlayerInfo[playerid][Money]);
239
240 SpawnPlayer(playerid);
241
242 SendClientMessage(playerid, -1, "You have successfully logged in.");
243 return 1;
244}
245
246public OnMySQLRegister(playerid)
247{
248 PlayerInfo[playerid][ID] = cache_insert_id();
249 printf("[Registration] New account registered. Database ID: [%d]", PlayerInfo[playerid][ID]);
250
251 TogglePlayerSpectating(playerid, false);
252
253 SpawnPlayer(playerid);
254 return true;
255}
256
257// Commands ========================================================================================
258
259CMD:setlevel(playerid, params[])
260{
261 if(!IsPlayerAdmin(playerid) && PlayerInfo[playerid][Admin] <= MANAGER_LEVEL) return SendClientMessage(playerid, -1, "Error: You Need Manager Rights for use this cmd");
262 new id, level, query[128];
263 if(sscanf(params,"ii", id, level)) return SendClientMessage(playerid, -1,""R"USAGE: /setlevel [playerid] [Level]");
264 if(PlayerInfo[id][Admin] == level) return SendClientMessage(playerid, -1, ""R"Error: This Player Already have this level !");
265 if(!IsPlayerConnected(id)) return SendClientMessage(playerid, -1, ""R"Error: This Player Logged off !");
266 PlayerInfo[id][Admin] = level;
267 if(level > MAX_ADMIN_LEVEL)
268 {
269 SendClientMessage(playerid, -1, ""R"Admin Notice: "GRI"You promoted a player to administrator !");
270 }
271 if(level <= MANAGER_LEVEL)
272 {
273 SendClientMessage(playerid, -1, ""R"Admin Notice: "GRI"You promoted a player to management !");
274 }
275
276 mysql_format(register, query, sizeof(query), "UPDATE `accounts` SET `Admin` = '%d' WHERE `ID` = '%d'", PlayerInfo[id][Admin], PlayerInfo[playerid][ID]);
277 mysql_query(register, query);
278 SendClientMessage(playerid, -1, ""R"Admin Notice: "GRI"You got promoted by an management");
279 return 1;
280}
281
282CMD:setvip(playerid, params[])
283{
284 if(!IsPlayerAdmin(playerid) && PlayerInfo[playerid][Admin] <= MANAGER_LEVEL) return SendClientMessage(playerid, -1, "Error: You Need Manager Rights for use this cmd");
285 new id, level, query[128];
286 if(sscanf(params,"ii", id, level)) return SendClientMessage(playerid, -1,""R"USAGE: /setvip [playerid] [Level]");
287 if(PlayerInfo[id][VIP] == level) return SendClientMessage(playerid, -1, ""R"Error: This Player Already have this level !");
288 if(!IsPlayerConnected(id)) return SendClientMessage(playerid, -1, ""R"Error: This Player Logged off !");
289 if(level > MAX_VIP_LEVEL)
290 {
291 new str[120];
292 format(str, sizeof(str), ""R"Error: Max Level is : %d", MAX_VIP_LEVEL);
293 SendClientMessage(playerid, -1, str);
294 return 1;
295 }
296 PlayerInfo[id][VIP] = level;
297 mysql_format(register, query, sizeof(query), "UPDATE `accounts` SET `VIP` = '%d' WHERE `ID` = '%d'", PlayerInfo[id][VIP], PlayerInfo[playerid][ID]);
298 mysql_query(register, query);
299 SendClientMessage(playerid, -1, ""R"Admin Notice: "GRI"You promoted a player to VIP !");
300 SendClientMessage(playerid, -1, ""R"VIP Notice: "GRI"You got promoted to a VIP Level by an managements");
301 return 1;
302}