· 7 years ago · Sep 09, 2018, 10:08 AM
1class PlayerAccountStats
2{
3 registered = false;
4 logged = false;
5 kills = 0;
6 deaths = 0;
7 headshots = 0;
8 level = 1;
9 joins = 0;
10 autologin = "on";
11}
12
13function LoadInfo( player )
14{
15 if ( player )
16 {
17 local query = QuerySQL( database, "SELECT * FROM account WHERE player = '" + player.Name.tolower() + "'" );
18 if ( query )
19 {
20 if ( ( GetSQLColumnData( query, 2 ).tostring() == player.UniqueID ) && ( GetSQLColumnData( query, 9 ).tostring() == "on" ) )
21 {
22 local KILLS = GetSQLColumnData( query, 3 ), DEATHS = GetSQLColumnData( query, 4 ), HEADSHOTS = GetSQLColumnData( query, 5 ), JOINS = GetSQLColumnData( query, 6 ), LEVEL = GetSQLColumnData( query, 8 );
23 stats[ player.ID ].kills = KILLS.tointeger();
24 stats[ player.ID ].deaths = DEATHS.tointeger();
25 stats[ player.ID ].headshots = HEADSHOTS.tointeger();
26 stats[ player.ID ].joins = JOINS.tointeger();
27 stats[ player.ID ].level = LEVEL.tointeger();
28 player.Cash = GetSQLColumnData( query, 7 ).tointeger();
29 stats[ player.ID ].autologin = GetSQLColumnData( query, 9 ).tostring();
30 stats[ player.ID ].joins++;
31 stats[ player.ID ].registered = true;
32 stats[ player.ID ].logged = true;
33 ClientMessageToAll( format( ">> %s has been auto logged in.", player.Name ), 0, 255, 0 );
34 PrivMessage( player, format( "Nickname:[ %s ] Kills:[ %d ] Deaths:[ %d ] Headshots:[ %d ] Level:[ %d ] Joins:[ %d ]", GetSQLColumnData( query, 0 ), KILLS.tointeger(), DEATHS.tointeger(), HEADSHOTS.tointeger(), LEVEL.tointeger(), JOINS.tointeger() ) );
35 }
36 else if ( ( GetSQLColumnData( query, 2 ).tostring() != player.UniqueID ) || ( GetSQLColumnData( query, 9 ).tostring() == "off" ) )
37 {
38 stats[ player.ID ].registered = true;
39 PrivMessage( player, format( "Welcome back %s! Please log-in into your account using /login <password>", player.Name ) );
40 }
41 }
42 else PrivMessage( player, "You are not registered. Type /register <password> to register an account." );
43 }
44 else return 0;
45}
46
47function SaveInfo( player )
48{
49 if ( player )
50 {
51 local player_name = player.Name, KILLS = stats[ player.ID ].kills, DEATHS = stats[ player.ID ].deaths, HEADSHOTS = stats[ player.ID ].headshots, JOINS = stats[ player.ID ].headshots, PC = player.Cash, LEVEL = stats[ player.ID ].level, AUTOLOGIN = stats[ player.ID ].autologin;
52 local q = QuerySQL( database, "SELECT player FROM account WHERE player = '" + player_name.tolower() + "'" );
53 if ( q ) QuerySQL( database, "UPDATE account SET kills = '" + KILLS.tointeger() + "', deaths = '" + DEATHS.tointeger() + "', headshots = '" + HEADSHOTS.tointeger() + "', joins = '" + JOINS.tointeger() + "', cash = '" + PC.tointeger() + "', level = '" + LEVEL.tointeger() + "', autologin = '" + AUTOLOGIN.tostring() + "' WHERE player = '" + player_name.tolower() + "'" );
54 print( format( "*** [%d] %s's stats have been successfully saved. (Kills:[ %d ] Deaths:[ %d ] Headshots:[ %d ] Cash:[ $%d ] Level:[ %d ] Autologin:[ %s ] Joins:[ %d ])", player.ID, player_name, KILLS.tointeger(), DEATHS.tointeger(), HEADSHOTS.tointeger(), PC.tointeger(), LEVEL.tointeger(), AUTOLOGIN.tostring(), JOINS.tointeger() ) );
55 }
56 else return 0;
57}
58
59function inccash( player, amount )
60{
61 if ( player ) player.Cash += amount.tointeger();
62 else return 0;
63}
64
65function deccash( player, amount )
66{
67 if ( player )
68 {
69 if ( player.Cash > amount.tointeger() ) player.Cash -= amount.tointeger();
70 else player.Cash = 0;
71 }
72 else return 0;
73}
74
75///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
76
77function onScriptLoad()
78{
79 stats <- array( GetMaxPlayers(), null );
80
81 database <- ConnectSQL( "data_base.db" );
82 QuerySQL( database, "CREATE TABLE IF NOT EXISTS account ( player VARCHAR(32), password VARCHAR(255), uid VARCHAR(255), kills INTEGER, deaths INTEGER, headshots INTEGER, joins INTEGER, cash INTEGER, level INTEGER, autologin TEXT )" );
83 print( "Successfully loaded database by =TRC=Kelvin." );
84}
85
86function onScriptUnload()
87{
88 DisconnectSQL( database );
89}
90
91function onPlayerJoin( player )
92{
93 stats[ player.ID ] = PlayerAccountStats();
94 LoadInfo( player );
95}
96
97function onPlayerPart( player, reason )
98{
99 if ( stats[ player.ID ].logged ) SaveInfo( player );
100 stats[ player.ID ] = null;
101}
102
103function onPlayerSpawn( player )
104{
105 if ( !stats[ player.ID ].registered ) PrivMessage( player, "You are not registered. Type /register <password> to register an account." );
106 else if ( !stats[ player.ID ].logged )
107 {
108 ClientMessageToAll( format( "Auto-kicked:[ %s ] Reason:[ Not logged-in ]", player.Name ), 255, 0, 0 );
109 KickPlayer( player );
110 }
111}
112
113function onPlayerDeath( player, reason )
114{
115 stats[ player.ID ].deaths++;
116 deccash( player, 5000 );
117}
118
119function onPlayerKill( player, killer, reason, bodypart )
120{
121 if ( bodypart == 6 )
122 {
123 stats[ player.ID ].headshots++;
124 player.Cash += 50000;
125 PrivMessage( player, format( "HEADSHOT on %s! Reward: $50000.", killer.Name ) );
126 }
127 stats[ player.ID ].kills++;
128 inccash( player, 5000 );
129 stats[ killer.ID ].deaths++;
130 deccash( killer, 5000 );
131}
132
133function onPlayerCommand( player, cmd, text )
134{
135 if ( cmd == "register" )
136 {
137 if ( ( stats[ player.ID ].registered ) || ( stats[ player.ID ].logged ) ) PrivMessage( player, "Error: You are already registered." );
138 else if ( !text ) PrivMessage( player, format( "Error: Use /%s <password>", cmd ) );
139 else
140 {
141 inccash( player, 20000 );
142 QuerySQL( database, "INSERT INTO account ( player, password, uid, kills, deaths, headshots, joins, cash, level, autologin ) VALUES ( '" + player.Name.tolower() + "', '" + SHA256( text ) + "', '" + player.UniqueID + "', '0', '0', '0', '1', '0', '1', 'on' )" );
143 stats[ player.ID ].registered = true;
144 stats[ player.ID ].logged = true;
145 PrivMessage( player, format( "You have been successfully registered! Nickname:[ %s ] Password:[ %s ]", player.Name, text ) );
146 MessageAllExcept( format( "[#00FF00]>> %s has been successfully registered.", player.Name ), player );
147 }
148 }
149
150 else if ( cmd == "login" )
151 {
152 if ( stats[ player.ID ].logged ) PrivMessage( player, "Error: You are already logged-in." );
153 else if ( !text ) PrivMessage( player, format( "Error: Use /%s <password>", cmd ) );
154 else if ( SHA256( text ) != GetSQLColumnData( QuerySQL( database, "SELECT password FROM account WHERE player = '" + player.Name.tolower() + "'" ), 0 ) ) PrivMessage( player, "INVALID PASSWORD." );
155 else
156 {
157 local query = QuerySQL( database, "SELECT * FROM account WHERE player = '" + player.Name.tolower() + "'" );
158 if ( query )
159 {
160 local KILLS = GetSQLColumnData( query, 3 ), DEATHS = GetSQLColumnData( query, 4 ), HEADSHOTS = GetSQLColumnData( query, 5 ), JOINS = GetSQLColumnData( query, 6 ), LEVEL = GetSQLColumnData( query, 8 );
161 stats[ player.ID ].kills = KILLS.tointeger();
162 stats[ player.ID ].deaths = DEATHS.tointeger();
163 stats[ player.ID ].headshots = HEADSHOTS.tointeger();
164 stats[ player.ID ].joins = JOINS.tointeger();
165 stats[ player.ID ].level = LEVEL.tointeger();
166 player.Cash = GetSQLColumnData( query, 7 ).tointeger();
167 stats[ player.ID ].autologin = GetSQLColumnData( query, 9 ).tostring();
168 stats[ player.ID ].joins++;
169 stats[ player.ID ].registered = true;
170 stats[ player.ID ].logged = true;
171 PrivMessage( player, format( "Nickname:[ %s ] Kills:[ %d ] Deaths:[ %d ] Headshots:[ %d ] Level:[ %d ] Joins:[ %d ]", GetSQLColumnData( query, 0 ), KILLS.tointeger(), DEATHS.tointeger(), HEADSHOTS.tointeger(), LEVEL.tointeger(), JOINS.tointeger() ) );
172 ClientMessageToAll( format( ">> %s has logged-in.", player.Name ), 0, 255, 0 );
173 }
174 else PrivMessage( player, "wtf" );
175 }
176 }
177
178 else if ( ( cmd == "changepass" ) || ( cmd == "changepassword" ) )
179 {
180 if ( !stats[ player.ID ].logged ) PrivMessage( player, "Error: You are not logged-in. Type /login <password>" );
181 else if ( !text ) PrivMessage( player, format( "Error: Use /%s <new password>", cmd ) );
182 else
183 {
184 local q = QuerySQL( database, "SELECT password FROM account WHERE player = '" + player.Name.tolower() + "'" );
185 if ( q )
186 {
187 QuerySQL( database, "UPDATE account SET password = '" + SHA256( text ) + "' WHERE player = '" + player.Name.tolower() + "'" );
188 PrivMessage( player, format( "Your password has been successfully changed to:[ %s ]", text ) );
189 }
190 else PrivMessage( player, "Error: Your account was not found in database." );
191 }
192 }
193
194 else if ( cmd == "autologin" )
195 {
196 if ( !stats[ player.ID ].logged ) PrivMessage( player, "Error: You are not logged-in. Type /login <password>" );
197 else if ( !text ) PrivMessage( player, format( "Error: Use /%s <on/off>", cmd ) );
198 else if ( text == "on" )
199 {
200 if ( stats[ player.ID ].autologin == "on" ) PrivMessage( player, "Error: Your autologin is already turned on." );
201 else
202 {
203 stats[ player.ID ].autologin = "on";
204 PrivMessage( player, "Your autologin has been turned on." );
205 }
206 }
207 else if ( text == "off" )
208 {
209 if ( stats[ player.ID ].autologin == "off" ) PrivMessage( player, "Error: Your autologin is already turned off." );
210 else
211 {
212 stats[ player.ID ].autologin = "off";
213 PrivMessage( player, "Your autologin has been turned off." );
214 }
215 }
216 else PrivMessage( player, format( "Error: Use /%s <on/off>", cmd ) );
217 }
218
219 else if ( cmd == "stats" )
220 {
221 if ( !text ) PrivMessage( player, format( "Error: Use /%s <player>", cmd ) );
222 else
223 {
224 local plr = FindPlayer( text );
225 if ( !plr ) PrivMessage( player, "Error: Unknown player." );
226 else
227 {
228 if ( stats[ plr.ID ].logged ) ClientMessageToAll( format( ">> %s's stats: Kills:[ %d ] Deaths:[ %d ] Headshots:[ %d ] Cash:[ $%d ] Level:[ %d ] Joins:[ %d ]", plr.Name, stats[ plr.ID ].kills, stats[ plr.ID ].deaths, stats[ plr.ID ].headshots, plr.Cash, stats[ plr.ID ].level, stats[ plr.ID ].joins ), 255, 0, 0 );
229 else PrivMessage( player, format( "Error: %s is not logged-in.", plr.Name ) );
230 }
231 }
232 }
233
234 else if ( ( cmd == "setlevel" ) || ( cmd == "setlvl" ) )
235 {
236 if ( stats[ player.ID ].level < 10 ) PrivMessage( player, "Error: You are not authorized to use this command." );
237 else if ( !stats[ player.ID ].logged ) PrivMessage( player, "Error: You are not logged-in." );
238 else if ( !text ) PrivMessage( player, format( "Error: Use /%s <player> <level>", cmd ) );
239 else
240 {
241 local txt = split( text, " " );
242 if ( txt.len() >= 2 )
243 {
244 local plr = FindPlayer( txt[ 0 ] ), lvl = txt[ 1 ];
245 if ( !plr ) PrivMessage( player, "Error: Unknown player." );
246 else if ( !IsNum( lvl ) ) PrivMessage( player, "Error: Level must be numbers..." );
247 else if ( ( lvl.tointeger() < 1 ) || ( lvl.tointeger() > 10 ) ) ClientMessage( "ERROR: Allowed level amount are between 1 and 10.", player, 255, 0, 0 );
248 else if ( stats[ plr.ID ].level == lvl.tointeger() ) PrivMessage( player, format( "Error: %s's level is %d already.", plr.Name, lvl.tointeger() ) );
249 else
250 {
251 stats[ plr.ID ].level = lvl.tointeger();
252 ClientMessageToAll( format( "* Admin %s changed %s's level to:[ %d ]", player.Name, plr.Name, lvl.tointeger() ), 0, 255, 0 );
253 }
254 }
255 else PrivMessage( player, format( "Error: Use /%s <player> <level>", cmd ) );
256 }
257 }
258 return 1;
259}
260
261/*
262Updates:
263
264- Changed class name from 'stat' to 'PlayerAccountStats'.
265- If you register an account with any nickname, the nickname will be saved to database with lowercase characters. (For example: from '=TRC=Kelvin' to '=trc=kelvin')
266- Added auto-login system.
267- Edited 'LoadInfo', 'SaveInfo', 'inccash' 'deccash', 'onScriptLoad', 'onPlayerJoin', 'onPlayerDeath' and 'onPlayerKill' functions.
268- Edited 'register' and 'login' commands.
269- Added 1 command: 'autologin'. (/autologin <on/off>)
270
271https://forum.vc-mp.org/?topic=6170.msg42805#msg42805
272
273~ =TRC=Kelvin.
274*/