· 8 years ago · Jul 15, 2018, 09:20 PM
1function onScriptLoad()
2{
3try{
4db <- ConnectSQL( "DataBase.db" );
5QuerySQL( db, "CREATE TABLE IF NOT EXISTS Accounts ( Name TEXT, Pass TEXT, Logged TEXT, Level NUMERIC, Cash NUMERIC, BankCash NUMERIC, IP TEXT, Registered TEXT )" );
6print( "Loaded Account System script" );
7}
8catch(e) print( "Error: " + e );
9
10 dofile( "FBS-Echo.nut" );
11 ActivateEcho();
12}
13
14
15
16
17function onPlayerJoin( player )
18{
19 try{
20 if ( player.IP != GetPlayerIP( player ) ) SetLogged( player, "false" );
21 else if ( player.IP == GetPlayerIP( player ) ) SetLogged( player, "true" );
22 if ( GetLevel( player ) ) NewTimer( "AccInfo", 1000, 1, player );
23 else
24 {
25 PrivMessage( "You're not Registered. Register your Nick to protect it.", player );
26 PrivMessage( "Type /c register <password> to Register", player );
27 }
28 }
29 catch(e) print( "OnPLayerJoin Error: " + e );
30
31}
32
33function onPlayerSpawn( player )
34{
35 try{
36 if ( ( GetLevel( player ) ) && ( GetLogged( player ) == "true" ) )
37 {
38 Message( ">> " + player + " has Spawned." );
39 player.Cash = GetCash( player );
40 }
41 if ( ( GetLevel( player ) ) && ( GetLogged( player ) == "false" ) )
42 {
43 player.Health = 0;
44 PrivMessage( "You aren't logged in. Do /c login <password> first", player );
45 }
46 }
47 catch(e) print( "OnPLayerSpawn Error: " + e );
48}
49
50
51//------- Side Functions --------
52
53function SetLogged( player, status )
54{
55 QuerySQL( db, format( "UPDATE Accounts SET Logged='%s' WHERE Name='" + player.Name + "'", status ) );
56}
57
58function SetIPLogged( player, sameip )
59{
60 QuerySQL( db, format( "UPDATE Accounts SET IP='%s' WHERE Name='" + player.Name + "'", sameip ) );
61}
62
63function GetPlayerIP( player )
64{
65 local IP = GetSQLColumnData( QuerySQL( db, "SELECT IP FROM Accounts WHERE Name='" + player.Name + "'" ), 0 );
66 if ( IP ) return IP;
67 else return 0;
68}
69
70function GetLevel( player )
71{
72 local lvl = GetSQLColumnData( QuerySQL( db, "SELECT Level FROM Accounts WHERE Name='" + player.Name + "'" ), 0 );
73 if ( lvl ) return lvl;
74 else return 0;
75}
76
77function GetCash( player )
78{
79 local cash = GetSQLColumnData( QuerySQL( db, "SELECT Cash FROM Accounts WHERE Name='" + player.Name + "'" ), 0 );
80 if ( cash ) return cash;
81 else return 0;
82}
83
84function GetBankCash( player )
85{
86 local cash = GetSQLColumnData( QuerySQL( db, "SELECT BankCash FROM Accounts WHERE Name='" + player.Name + "'" ), 0 );
87 if ( cash ) return cash;
88 else return 0;
89}
90
91function GetPass( player )
92{
93 local pass = GetSQLColumnData( QuerySQL( db, "SELECT Pass FROM Accounts WHERE Name='" + player.Name + "'" ), 0 );
94 if ( pass ) return pass;
95 else return 0;
96}
97
98function GetLogged( player )
99{
100 local log = GetSQLColumnData( QuerySQL( db, "SELECT Logged FROM Accounts WHERE Name='" + player.Name + "'" ), 0 );
101 if ( log ) return log;
102 else return 0;
103}
104
105function AccInfo( player )
106{
107 try{
108 if ( GetLevel( player ) )
109 {
110 if ( GetLogged( player ) == "true" )
111 {
112 PrivMessage( "You've Auto-Logged in on the server!", player );
113 PrivMessage( "Name:[ " + player.Name + " ] Level:[ " + GetLevel( player ) + " ]", player );
114 Announce( "~h~Auto Logged in!", player, 0 );
115 }
116 else if ( GetLogged( player ) == "false" )
117 {
118 PrivMessage( "You're not Logged in. Please log in before spawning", player );
119 PrivMessage( "Use /c login <your password> to login in your account", player );
120 }
121 }
122 }
123 catch(e) print( "AccInfo Error: " + e );
124}
125
126function rotateRight(val, sbits)
127{
128 return (val >> sbits) | (val << (0x20 - sbits));
129}
130function e( string )
131{
132 local hp = [
133 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,
134 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19
135 ];
136
137 local k = [
138 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
139 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
140 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
141 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
142 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
143 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
144 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
145 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
146 ];
147
148 local
149 w = array( 64 ),
150 i = 0,
151 s = 0,
152 len = string.len( ),
153 word_array = array( 0 );
154
155 for( i = 0; i < len - 3; i += 4 )
156 {
157 word_array.push( string[i] << 0x18 | string[i + 1] << 0x10 | string[i + 2] << 0x08 | string[i + 3] );
158 }
159
160 switch( len % 4 )
161 {
162 case 0:
163 i = 0x80000000;
164 break;
165 case 1:
166 i = string[len - 1] << 0x18 | 0x80000000;
167 break;
168 case 2:
169 i = string[len - 2] << 0x18 | string[len - 1] << 0x10 | 0x08000;
170 break;
171 case 3:
172 i = string[len - 3] << 0x18 | string[len - 2] << 0x10 | string[len - 1] << 0x08 | 0x80;
173 break;
174 }
175 word_array.push( i );
176
177 while( ( word_array.len() % 0x10 ) != 0x0E )
178 word_array.push( 0 );
179
180 word_array.push( len >> 0x10 );
181 word_array.push( ( len << 0x03 ) & 0xFFFFFFFF );
182
183 local s0, s1;
184 for( s = 0; s < word_array.len(); s += 0x10 )
185 {
186 for( i = 0x00; i < 0x10; i++ )
187 w[i] = word_array[s + i];
188
189 for( i = 0x10; i < 0x40; i++ )
190 {
191 s0 = rotateRight( w[i - 15], 7 ) ^ rotateRight( w[i - 15], 18 ) ^ ( w[i - 15] >> 3 );
192 s1 = rotateRight( w[i - 2], 17 ) ^ rotateRight( w[i - 2], 19 ) ^ ( w[i - 2] >> 10 );
193 w[i] = w[i - 0x10] + s0 + w[i - 7] + s1;
194 }
195
196 local a = hp[0],
197 b = hp[1],
198 c = hp[2],
199 d = hp[3],
200 e = hp[4],
201 f = hp[5],
202 g = hp[6],
203 h = hp[7];
204
205 for( i = 0x00; i < 0x40; i++ )
206 {
207 s0 = ( rotateRight( a, 2 ) ^ rotateRight( a, 13 ) ^ rotateRight( a, 22 ) );
208 local maj = ( ( a & b ) ^ ( a & c ) ^ ( b & c ) );
209 local t2 = ( s0 + maj );
210 s1 = ( rotateRight( e, 6 ) ^ rotateRight( e, 11) ^ rotateRight( e, 25 ) );
211 local ch = ( ( e & f ) ^ ( ( ~e ) & g ) );
212 local t1 = ( h + s1 + ch + k[i] + w[i] );
213
214 h = g;
215 g = f;
216 f = e;
217 e = d + t1;
218 d = c;
219 c = b;
220 b = a;
221 a = t1 + t2;
222 }
223
224 hp[0] += a;
225 hp[1] += b;
226 hp[2] += c;
227 hp[3] += d;
228 hp[4] += e;
229 hp[5] += f;
230 hp[6] += g;
231 hp[7] += h;
232 }
233
234 local hash = format(
235 "%08x%08x%08x%08x%08x%08x%08x%08x",
236 hp[0],
237 hp[1],
238 hp[2],
239 hp[3],
240 hp[4],
241 hp[5],
242 hp[6],
243 hp[7]
244 );
245
246 return hash;
247}
248
249function Register( player, pass, pass2 )
250{
251 try{
252 QuerySQL( db, "REPLACE INTO Accounts ( Name, Pass, Logged, Level, Cash, BankCash, IP, Registered ) VALUES ( '" + player.Name + "', '" + pass + "', 'true', 1, 2000, 0, '" + player.IP + "', '" + GetFullTime() + "' )" );
253 player.Cash = 2000;
254
255 PrivMessage( "Registered! Password:[ " + pass2 + " ]", player );
256 PrivMessage( "Nick: " + player.Name + ", Level: " + GetLevel( player ) + "", player );
257 Announce( "~y~REGISTERED!", player, 0 );
258 ClientMessageToAll( ">> " + player.Name + " is a register Nick-Name now!", 984, 252, 777 );
259 }
260 catch(e) print( "Register Function Error: " + e );
261}
262
263function Login( player, pass )
264{
265 try{
266 SetLogged( player, "true" );
267 SetIPLogged( player, player.IP );
268 player.Cash = GetCash( player );
269 PrivMessage( "You've successfully logged in!", player );
270 PrivMessage( "Nick: " + player.Name + ", Level: " + GetLevel( player ) + "", player );
271 Announce( "~y~Logged! :)", player, 0 );
272 }
273 catch(e) print( "Login Function Error: " + e );
274}
275
276//-------- Commands -----------
277
278function onPlayerCommand( player, command, text )
279{
280
281 local cmd = command.tolower();
282
283 if ( cmd == "login" )
284 {
285 try{
286 if ( !GetLevel( player ) ) PrivMessage( "[Error] - You're not Registered", player );
287 else if ( GetLogged( player ) == "true" ) PrivMessage( "[Error] - You're already logged in", player );
288 else if ( !text ) PrivMessage( "[Syntax] - /c " + cmd + " <password> ", player );
289 else
290 {
291 if ( e( text ) != GetPass( player ) ) PrivMessage( "[Error] - Wrong Password", player );
292 else Login( player, e(text) );
293 }
294 }
295 catch(e) print( "Login cmd error: " + e );
296 }
297 else if ( cmd == "register" )
298 {
299 try{
300 if ( GetLevel( player ) ) PrivMessage( "[Error] - You're already register!", player );
301 else if ( !text ) PrivMessage( "[Error] - /c " + cmd + " <password>", player );
302 else Register( player, e( text ), text );
303 }
304 catch(e) print( "Register Cmd Error: " + e );
305 }
306
307 else if ( cmd == "setlevel" )
308 {
309 try{
310 if ( GetLevel( player ) < 5 ) PrivMessage( "[Error] - You're not authorized", player );
311 else if ( !text ) PrivMessage( "[Error] Missing Information - /c " + cmd + " <player> <level>", player );
312 else if ( NumTok( text, " " ) < 2 ) PrivMessage( "[Error] Missing Information - /c " + cmd + " <player> <level>", player );
313 else
314 {
315 local plr = FindPlayer( GetTok( text, " ", 1 ) );
316 if ( !plr ) PrivMessage( "Unknown player", player );
317 else if ( !IsNum( GetTok( text, " ", 2 ) ) ) PrivMessage( "[Error] - Invalid level. Must be integers", player );
318 else
319 {
320 local level = GetTok( text, " ", 2 );
321 Setlevel( plr, level.tointeger() );
322 Message( ">> Admin " + player + " chanegd level of " + plr.Name + " to:[ " + level + " ]" );
323
324 }
325 }
326 }
327 catch(e) print( "error set: " + e );
328 }
329
330function Setlevel( player, lvl )
331{
332 QuerySQL( db, "UPDATE Accounts SET Level='" + lvl + "' WHERE Name='" + player.Name + "'" );
333}
334
335function NumTok(string, separator)
336{
337 local tokenized = split(string, separator);
338 return tokenized.len();
339}
340
341function GetTok(string, separator, n, ...)
342{
343 local m = vargv.len() > 0 ? vargv[0] : n,
344 tokenized = split(string, separator),
345 text = "";
346
347 if (n > tokenized.len() || n < 1) return null;
348 for (; n <= m; n++)
349 {
350 text += text == "" ? tokenized[n-1] : separator + tokenized[n-1];
351 }
352 return text;
353
354
355 else if ( cmd == "level" )
356 {
357 if ( !GetPlayerLevel( player ) ) ::PrivMessage( "Register before using commands.", player );
358 else
359 {
360 Message(player + "'s level:[ " + GetPlayerLevel( player ).tofloat() + " ]");
361
362 }
363 }
364}