· 4 years ago · Apr 25, 2021, 05:48 PM
1
2// =========================================== S E R V E R E V E N T S ==============================================
3/*
4
5░█████╗░░█████╗░░█████╗░░█████╗░██╗░░░██╗███╗░░██╗████████╗ ░██████╗██╗░░░██╗░██████╗████████╗███████╗███╗░░░███╗
6██╔══██╗██╔══██╗██╔══██╗██╔══██╗██║░░░██║████╗░██║╚══██╔══╝ ██╔════╝╚██╗░██╔╝██╔════╝╚══██╔══╝██╔════╝████╗░████║
7███████║██║░░╚═╝██║░░╚═╝██║░░██║██║░░░██║██╔██╗██║░░░██║░░░ ╚█████╗░░╚████╔╝░╚█████╗░░░░██║░░░█████╗░░██╔████╔██║
8██╔══██║██║░░██╗██║░░██╗██║░░██║██║░░░██║██║╚████║░░░██║░░░ ░╚═══██╗░░╚██╔╝░░░╚═══██╗░░░██║░░░██╔══╝░░██║╚██╔╝██║
9██║░░██║╚█████╔╝╚█████╔╝╚█████╔╝╚██████╔╝██║░╚███║░░░██║░░░ ██████╔╝░░░██║░░░██████╔╝░░░██║░░░███████╗██║░╚═╝░██║
10╚═╝░░╚═╝░╚════╝░░╚════╝░░╚════╝░░╚═════╝░╚═╝░░╚══╝░░░╚═╝░░░ ╚═════╝░░░░╚═╝░░░╚═════╝░░░░╚═╝░░░╚══════╝╚═╝░░░░░╚═╝
11
12██████╗░██╗░░░██╗ ░██████╗██╗░░██╗██╗░░░██╗
13██╔══██╗╚██╗░██╔╝ ██╔════╝██║░░██║╚██╗░██╔╝
14██████╦╝░╚████╔╝░ ╚█████╗░███████║░╚████╔╝░
15██╔══██╗░░╚██╔╝░░ ░╚═══██╗██╔══██║░░╚██╔╝░░
16██████╦╝░░░██║░░░ ██████╔╝██║░░██║░░░██║░░░
17╚═════╝░░░░╚═╝░░░ ╚═════╝░╚═╝░░╚═╝░░░╚═╝░░░
18*/
19class PlayerStats
20{
21Kills = 0;
22Deaths = 0;
23Cash = 0;
24Level = 0;
25Registered = false;
26Logged = false;
27Bank = 0;
28AutoLogin = "on";
29 Weapons = [];
30 DP = false;
31 dPos = null;
32 Spree = 0;
33}
34function onServerStart()
35{
36}
37
38function onServerStop()
39{
40}
41
42function onScriptLoad()
43{
44stats <- array ( GetMaxPlayers(), null );
45 db <- ConnectSQL("Database.db");
46 QuerySQL( db, "CREATE TABLE IF NOT EXISTS Accounts( Nickname TEXT, Password TEXT, IP VARCHAR(32), UID VARCHAR(255), UID2 VARCHAR(255), Kills INTEGER, Deaths INTEGER, Cash INTEGER, Bank INTEGER, Level INTEGER, AutoLogin TEXT )");
47 print("Account system by SHy has been loaded."); //This is to keep account system's credits
48}
49
50function onScriptUnload()
51{
52DiscconectSQL( db );
53}
54function PlayerInfo(player)
55{
56local q = QuerySQL( db, "SELECT * FROM Accounts WHERE Nickname='"+player.Name+"'" );
57if (q)
58{
59if ( GetSQLColumnData( q, 2 ) == player.IP && GetSQLColumnData( q, 3 ) == player.UniqueID && GetSQLColumnData( q, 4 ) == player.UniqueID2 && GetSQLColumnData( q, 10 ).tostring() == "on" )
60{
61Message("[#c00ff2]"+player.Name+" got automatically logged in.");
62stats[ player.ID ].Registered = true;
63stats[ player.ID ].Logged = true;
64stats[ player.ID ].Kills = GetSQLColumnData( q, 5 );
65stats[ player.ID ].Deaths = GetSQLColumnData( q, 6 );
66AddCash( player, GetSQLColumnData( q, 7 ) );
67stats[ player.ID ].Bank = GetSQLColumnData( q, 8 );
68stats[ player.ID ].Level = GetSQLColumnData( q, 9 );
69QuerySQL( db, "UPDATE Accounts SET IP='"+player.IP+"', UID='"+player.UniqueID+"', UID2='"+player.UniqueID2+"' WHERE Nickname='"+player.Name+"'" );
70}
71else
72{
73MessagePlayer("[#000fff]The account ( "+player.Name+" ) is registered, please login into it.", player);
74stats[ player.ID ].Registered = true;
75}
76}
77else MessagePlayer("[#00ff00]Your account is not registered, type /register to have a control over your account!", player);
78}
79function RemoveCash( player, amount )
80{
81local cash = stats[ player.ID ].Cash;
82local det = cash - amount;
83stats[ player.ID ].Cash = det;
84player.Cash = det;
85}
86function AddCash( player, amount )
87{
88local cash = stats[ player.ID ].Cash;
89local add = cash + amount;
90stats[ player.ID ].Cash = add;
91player.Cash = add;
92}
93function UpdateInfo(player)
94{
95QuerySQL( db, "UPDATE Accounts SET IP='"+player.IP+"', UID='"+player.UniqueID+"', UID2='"+player.UniqueID2+"', Kills = '"+stats[ player.ID ].Kills+"', Deaths='"+stats[ player.ID ].Deaths+"', Cash='"+stats[ player.ID ].Cash+"', Bank = '"+stats[ player.ID ].Bank+"' WHERE Nickname= '" + player.Name + "'" );
96print("Stats saved!");
97}
98// =========================================== P L A Y E R E V E N T S ==============================================
99
100function onPlayerJoin( player )
101{
102stats[ player.ID ] = PlayerStats();
103Message("[#00ff00]"+player.Name+" [#ffffff]has connected to the server.");
104PlayerInfo(player);
105}
106
107function onPlayerPart( player, reason )
108{
109 if ( stats[ player.ID ].Logged ) UpdateInfo(player);
110}
111
112function onPlayerRequestClass( player, classID, team, skin )
113{
114 return 1;
115}
116
117function onPlayerRequestSpawn( player )
118{
119if ( !stats[ player.ID ].Registered ) return MessagePlayer("[#ffffff]Please register to start playing in the server.", player);
120else if ( !stats[ player.ID ].Logged ) return MessagePlayer("[#ffffff]The account is registered, please do /login.", player);
121else return 1;
122}
123
124function onPlayerSpawn( player )
125{
126 GiveSpawnwep(player);
127 if ( stats[ player.ID ].DP ) {
128player.Pos = stats[ player.ID ].dPos;
129PrivMessage( player, "You have been teleported to the place where you had last died.");
130}
131}
132
133function onPlayerDeath( player, reason )
134{
135stats[ player.ID ].Deaths++;
136if ( stats[ player.ID ].Cash >= 100 ) RemoveCash( player, 100 );
137UpdateInfo(player);
138if ( stats[ player.ID ].DP )
139{
140stats[ player.ID ].dPos = player.Pos;
141}
142}
143
144function onPlayerKill( killer, player, reason, bodypart )
145{
146 killer.Score++;
147stats[ killer.ID ].Kills++;
148stats[killer.ID].Spree++;
149if (stats[player.ID].Spree > 0) stats[player.ID].Spree--;
150stats[ player.ID ].Deaths++;
151AddCash( killer, 500 );
152if ( player.Cash >= 100 ) RemoveCash( player, 100 );
153PrivMessage( killer, "You received 500$ as a kill reward.");
154PrivMessage( player, "You have lost 100$ for being killed.");
155UpdateInfo(killer);
156UpdateInfo(player);
157checkSpree(killer);
158}
159
160function onPlayerTeamKill( killer, player, reason, bodypart )
161{
162killer.Health = 0;
163Message("[#0000ff]Auto-Killed "+killer.Name+" for teamkilling.");
164stats[ killer.ID ].Deaths++;
165stats[ player.ID ].Deaths++;
166}
167
168function onPlayerChat( player, text )
169{
170if ( !stats[ player.ID ].Logged ) return MessagePlayer("[#ff0000]Please login to speak.", player);
171else return 1;
172}
173function onPlayerCommand( player, cmd, text )
174{
175 if ( cmd == "register" )
176 {
177 if (!text) MessagePlayer("[#ff0000]Error:[#ffffff] Wrong syntax, use /"+cmd+" <Password>.:", player);
178 else if ( stats[ player.ID ].Registered ) MessagePlayer("[#ff0000]Error:[#ffffff] You are already registerd.", player);
179 else
180 {
181 local reward = 5000;
182AddCash( player, reward.tointeger() );
183 QuerySQL( db, "INSERT INTO Accounts( Nickname , Password, IP, UID, UID2, Kills, Deaths, Cash, Level, Bank, AutoLogin ) VALUES( '"+player.Name+"', '"+SHA256( text )+"', '"+player.IP+"', '"+player.UniqueID+"', '"+player.UniqueID2+"', '0', '0', '0', '1', '0', 'on')" );
184 Message("[#ff00ff]"+player.Name+" is a registered user now.");
185stats[ player.ID ].Registered = true;
186stats[ player.ID ].Logged = true;
187 MessagePlayer("[#ff00ff]You have registered your account in the server, you have received "+reward.tointeger()+"$ as a registration reward!", player);
188 }
189 }
190 else if ( cmd == "login" )
191 {
192 if (!text) MessagePlayer("[#ff0000]Error:[#ffffff] Wrong syntax, use /"+cmd+" <Password>.", player);
193 else if ( stats[ player.ID ].Logged ) MessagePlayer("[#ff0000]Error:[#ffffff] You're already logged in.", player);
194 else if ( !stats[ player.ID ].Registered ) MessagePlayer("[#ff0000]Error:[#ffffff] You're not registered, please type /register.", player);
195else
196{
197local q = QuerySQL( db, "SELECT * FROM Accounts WHERE Nickname='"+player.Name+"'" );
198local Pass = GetSQLColumnData( q, 1 );
199if ( SHA256( text ) != Pass ) MessagePlayer("[#ff0000]Error: [#ffffff] The password you entered is wrong.", player);
200else{
201stats[ player.ID ].Registered = true;
202stats[ player.ID ].Logged = true;
203stats[ player.ID ].Kills = GetSQLColumnData( q, 5 ).tointeger();
204stats[ player.ID ].Deaths = GetSQLColumnData( q, 6 ).tointeger();
205AddCash( player, GetSQLColumnData( q, 7 ) );
206stats[ player.ID ].Bank = GetSQLColumnData( q, 8 ).tointeger();
207stats[ player.ID ].Level = GetSQLColumnData( q, 9 ).tointeger();
208stats[ player.ID ].AutoLogin = GetSQLColumnData( q, 10 ).tostring();
209Message("[#00ff00]"+player.Name+" has logged into the server.");
210MessagePlayer("[#ffffff]You've successfully logged in.", player);
211}
212}
213}
214else if ( cmd == "setpass" )
215{
216if (!text) MessagePlayer("[#ff0000]Error: [#ffffff] /setpass <New Pass>.", player);
217else if ( !stats[ player.ID ].Registered ) MessagePlayer("[#ff0000]Error:[#ffffff] You are not registered.", player);
218else if ( !stats[ player.ID ].Logged ) MessagePlayer("[#ff0000]Error: [#ffffff] You're not logged in, please /login.", player);
219else{
220QuerySQL( db, "UPDATE Accounts SET Password='"+SHA256( text )+"' WHERE Nickname='"+player.Name+"'" );
221MessagePlayer("[#00ff00]You have successfully changed your password to: ( "+text+" ).", player);
222}
223}
224else if ( cmd == "stats" )
225{
226if (!text)
227{
228MessagePlayer("[#00ff00]Your stats: Kills: "+stats[ player.ID ].Kills+", Deaths: "+stats[ player.ID ].Deaths+", Cash: "+stats[ player.ID ].Cash+", Bank:"+stats[ player.ID ].Bank+".", player);
229}
230else if (text)
231{
232local plr = FindPlayer(text);
233if (!plr) MessagePlayer("[#ff0000]Error:[#ffffff] Player not found.", player);
234else{
235MessagePlayer("[#f0f0ff] "+plr.Name+" statistics: Kills: "+stats[ plr.ID ].Kills+", Deaths: "+stats[ plr.ID ].Deaths+", Cash: "+stats[ plr.ID ].Cash+", Bank: "+stats[ plr.ID ].Bank+", Level: "+stats[ plr.ID ].Level+".", player);
236}
237}
238}
239else if ( cmd == "setautologin" || cmd == "autologin" )
240{
241if (!text) MessagePlayer("[#ff0000]Error: [#ffffff]Correct syntax: /"+cmd+" <on/off>.", player);
242else if ( !stats[ player.ID ].Registered ) MessagePlayer("[#ff0000]Error:[#ffffff] You're not registered.", player);
243else if ( !stats[ player.ID ].Logged ) MessagePlayer("[#ff0000]Error:[#ffffff] You're not logged in.", player);
244else if ( text == "on" )
245{
246QuerySQL( db, "UPDATE Accounts SET AutoLogin='on' WHERE Nickname='"+player.Name+"'" );
247MessagePlayer("[#00ff00]Your autologin has been turned on.", player);
248}
249else if ( text == "off" )
250{
251QuerySQL( db, "UPDATE Accounts SET AutoLogin='off' WHERE Nickname='"+player.Name+"'" );
252MessagePlayer("[#00ff00]Your autologin has been turned off.", player);
253}
254else MessagePlayer("[#ff0000]Error: use /"+cmd+" <on/off>.", player);
255}
256
257else if ( cmd =="credits" || cmd == "credts" )
258{
259MessagePlayer("[#ff000f]Account system by SHy.", player);
260}
261else if ( cmd == "cmds" || cmd == "commands" )
262{
263MessagePlayer("[#fff000]Available commands: (/)register, login, setautologin( or autologin ), setpass, stats, deposit, withdraw, givecash.", player);
264}
265else if ( cmd == "deposit" )
266{
267if (!text) MessagePlayer("[#ff0000]Error:[#ffffff] /deposit <amount>.", player);
268else if ( !stats[ player.ID ].Registered ) return MessaagePlayer("[#ff0000]Error:[#ffffff] Command is limited to registered users only.", player);
269else if ( !IsNum( text ) ) MessagePlayer("[#00ff00]Amount must be integer....", player);
270else if ( player.Cash < text.tointeger() ) return MessagePlayer("[#ff0000]Error: You don't have that much cash which you want to deposit.", player);
271else
272{
273stats[ player.ID ].Bank += text.tointeger();
274RemoveCash( player, text.tointeger() );
275MessagePlayer("[#fff000]You successfully deposited "+text.tointeger()+" amount in your bank account.", player);
276}
277}
278else if ( cmd == "withdraw" )
279{
280if (!text) MessagePlayer("[#ff0000]Error:[#ffffff] Use /withdraw <amount>.", player);
281else if ( !stats[ player.ID ].Registered ) return MessaagePlayer("[#ff0000]Error:[#ffffff] Command is limited to registered users only.", player);
282else if ( !IsNum( text ) ) MessagePlayer("[#00ff00]Amount must be integer....", player);
283else if ( stats[ player.ID ].Bank < text.tointeger() ) return MessagePlayer("[#ff0000]Error: You don't have that much cash which you want to withdraw.", player);
284else
285{
286stats[ player.ID ].Bank -= text.tointeger();
287AddCash( player, text.tointeger() );
288MessagePlayer("[#fff000]You successfully withdrawn "+text.tointeger()+" amount from your bank account.", player);
289}
290}
291else if ( cmd == "givecash" )
292{
293if (!text) MessagePlayer("[#ff0000]Error:[#ffffff] Use /givecash <Player> <Amount>.", player);
294else if ( !stats[ player.ID ].Registered ) return MessaagePlayer("[#ff0000]Error:[#ffffff] Command is limited to registered users only.", player);
295else
296{
297local plr = GetPlayer( GetTok( text, " ", 1 ) );
298local amount = GetTok( text, " ", 2 );
299if (!plr) MessagePlayer("[#ff0000]Error: Player not found.", player);
300else if (!amount) return MessagePlayer("[#ff00000]Error: [#ffffff]Enter amount u want to give.", player);
301else if ( !IsNum( amount ) ) return MessagePlayer("[#ff00000]Error: [#ffffff]Amount which you want to give must be integer.", player);
302else if ( plr.Name == player.Name ) return MessagePlayer("[#ffff00]You can't send cash cash to yourself.", player);
303else
304{
305RemoveCash( player, amount.tointeger() );
306AddCash( plr, amount.tointeger() );
307MessagePlayer("[#fffffff]You gave "+amount.tointeger()+"$ to "+plr.Name+".", player);
308MessagePlayer("[#fffffff]You have received "+amount.tointeger()+"$ from "+player.Name+".", plr );
309}
310}
311}
312
313else if ( cmd == "cash" || cmd == "bank" )
314{
315if ( !stats[ player.ID ].Registered ) return MessaagePlayer("[#ff0000]Error:[#ffffff] Command is limited to registered users only.", player);
316else
317{
318if (!text)
319{
320MessagePlayer("[#fff000]Your money statistics: Cash in hand: "+stats[ player.ID ].Cash+" and Bank account: "+stats[ player.ID ].Bank+".", player);
321}
322else if ( text )
323{
324local plr = FindPlayer(text);
325if ( !plr) return MessagePlayer("[#ff0000]Error:[#fff000]Player not found.", player);
326else if ( !stats[ plr.ID ].Registered ) return MessagePlayer("[#00ff00]Error: The player hasn't registered his account yet.", player);
327else
328{
329MessagePlayer("[#fff000]"+plr.Name+" money statistics: Cash in hand: "+plr.Cash+" and Bank account: "+stats[ plr.ID ].Bank+".", player);
330}
331}
332}
333}
334else if (cmd == "spawnwep") {
335 if (!text) return MessaagePlayer("Please use: /spawnwep <Weapons>.");
336 local weps = split( text, " " ),ID, wepsset = null;
337 for( local i = 0; i < weps.len(); i++ )
338 {
339 ( IsNum( weps[ i ] ) ) ? ID = weps[ i ].tointeger() : ID = GetWeaponID( weps[ i ] );
340 if ( ID >= 33 ) MessagePlayer( "[#ff0000]Error: Invalid Weapon ID/Name.", player );
341 else
342 {
343 player.SetWeapon( ID, 999 );
344 stats[player.ID].Weapons.push(ID);
345 if (wepsset == null) wepsset = " "+ ID;
346 else wepsset += (" " + ID);
347 }
348 }
349 MessagePlayer( "[#00ff00]Spawnwep saved.",player);
350}
351else if (cmd == "delspawnwep"){
352foreach (idx, val in stats[player.ID].Weapons) {
353 stats[player.ID].Weapons.remove(val);
354}
355MessaagePlayer("[#00ff00]Spawnweps have been set to default.", player);
356}
357else if ( cmd == "diepos" || "deathpos" )
358{
359if (!text) PrivMessage( player, "Error: Wrong syntax, Use /"+cmd+" <on/off>.");
360else
361{
362if ( text.tolower() == "on" )
363{
364if ( stats[ player.ID ].DP ) PrivMessage( player, "Deathpos already enabled.");
365else
366{
367stats[ player.ID ].DP = true;
368MessagePlayer("Deathpos enabled.", player);
369}
370}
371else if ( text.tolower() == "off" )
372{
373if ( !stats[ player.ID ].DP ) PrivMessage( player, "You had not enabled deathpos.");
374else
375{
376stats[ player.ID ].DP = false;
377PrivMessage( player, "Deathpos has been turned off.");
378}
379}
380}
381}
382else return MessaagePlayer("[#ff0000]Error: Invalid command!", player);
383}
384function onPlayerPM( player, playerTo, message )
385{
386 return 1;
387}
388// SLC's very useful functions
389function GetTok( string, separator, n, ... )
390{
391 local m = ( vargv.len() > 0 ) ? vargv[ 0 ] : n, tokenized = split( string, separator ), text = "";
392
393 if ( ( n > tokenized.len() ) || ( n < 1 ) ) return null;
394
395 for ( ; n <= m; n++ )
396 {
397 text += text == "" ? tokenized[ n - 1 ] : separator + tokenized[ n - 1 ];
398 }
399
400 return text;
401}
402
403function NumTok(string, separator)
404{
405 local tokenized = split(string, separator);
406 return tokenized.len();
407}
408function GetPlayer( target )
409{
410 local target1 = target.tostring();
411
412 if ( IsNum( target ) )
413 {
414 target = target.tointeger();
415
416 if ( FindPlayer( target) ) return FindPlayer( target );
417 else return null;
418 }
419 else if ( FindPlayer( target ) ) return FindPlayer( target );
420 else return null;
421}
422
423function onPlayerBeginTyping( player )
424{
425}
426
427function onPlayerEndTyping( player )
428{
429}
430
431function onNameChangeable( player )
432{
433}
434
435function onPlayerSpectate( player, target )
436{
437}
438
439function onPlayerCrashDump( player, crash )
440{
441}
442
443function onPlayerMove( player, lastX, lastY, lastZ, newX, newY, newZ )
444{
445}
446
447function onPlayerHealthChange( player, lastHP, newHP )
448{
449}
450
451function onPlayerArmourChange( player, lastArmour, newArmour )
452{
453}
454
455function onPlayerWeaponChange( player, oldWep, newWep )
456{
457}
458
459function onPlayerAwayChange( player, status )
460{
461}
462
463function onPlayerNameChange( player, oldName, newName )
464{
465}
466
467function onPlayerActionChange( player, oldAction, newAction )
468{
469}
470
471function onPlayerStateChange( player, oldState, newState )
472{
473}
474
475function onPlayerOnFireChange( player, IsOnFireNow )
476{
477}
478
479function onPlayerCrouchChange( player, IsCrouchingNow )
480{
481}
482
483function onPlayerGameKeysChange( player, oldKeys, newKeys )
484{
485}
486
487function onPlayerUpdate( player, update )
488{
489}
490
491function onClientScriptData( player )
492{
493 // receiving client data
494 local stream = Stream.ReadByte();
495 switch ( stream )
496 {
497 default:
498 break;
499 }
500}
501
502// ========================================== V E H I C L E E V E N T S =============================================
503
504function onPlayerEnteringVehicle( player, vehicle, door )
505{
506 return 1;
507}
508
509function onPlayerEnterVehicle( player, vehicle, door )
510{
511}
512
513function onPlayerExitVehicle( player, vehicle )
514{
515}
516
517function onVehicleExplode( vehicle )
518{
519}
520
521function onVehicleRespawn( vehicle )
522{
523}
524
525function onVehicleHealthChange( vehicle, oldHP, newHP )
526{
527}
528
529function onVehicleMove( vehicle, lastX, lastY, lastZ, newX, newY, newZ )
530{
531}
532
533// =========================================== P I C K U P E V E N T S ==============================================
534
535function onPickupClaimPicked( player, pickup )
536{
537 return 1;
538}
539
540function onPickupPickedUp( player, pickup )
541{
542}
543
544function onPickupRespawn( pickup )
545{
546}
547
548// ========================================== O B J E C T E V E N T S ==============================================
549
550function onObjectShot( object, player, weapon )
551{
552}
553
554function onObjectBump( object, player )
555{
556}
557
558// ====================================== C H E C K P O I N T E V E N T S ==========================================
559
560function onCheckpointEntered( player, checkpoint )
561{
562}
563
564function onCheckpointExited( player, checkpoint )
565{
566}
567
568// =========================================== B I N D E V E N T S =================================================
569
570function onKeyDown( player, key )
571{
572}
573
574function onKeyUp( player, key )
575{
576}
577
578// ================================== E N D OF O F F I C I A L E V E N T S ======================================
579
580
581function SendDataToClient( player, ... )
582{
583 if( vargv[0] )
584 {
585 local byte = vargv[0],
586 len = vargv.len();
587
588 if( 1 > len ) devprint( "ToClent <" + byte + "> No params specified." );
589 else
590 {
591 Stream.StartWrite();
592 Stream.WriteByte( byte );
593
594 for( local i = 1; i < len; i++ )
595 {
596 switch( typeof( vargv[i] ) )
597 {
598 case "integer": Stream.WriteInt( vargv[i] ); break;
599 case "string": Stream.WriteString( vargv[i] ); break;
600 case "float": Stream.WriteFloat( vargv[i] ); break;
601 }
602 }
603
604 if( player == null ) Stream.SendStream( null );
605 else if( typeof( player ) == "instance" ) Stream.SendStream( player );
606 else devprint( "ToClient <" + byte + "> Player is not online." );
607 }
608 }
609 else devprint( "ToClient: Even the byte wasn't specified..." );
610}
611
612function GiveSpawnwep(player) {
613 foreach (idx, ID in stats[player.ID].Weapons) {
614 player.SetWeapon(ID, 9999);
615 }
616}
617
618function checkSpree(player) {
619 if (stats[player.ID].Spree >= 5)
620 {
621 Message("[#00ff00]"+player.Name+" is on a killing spree of "+stats[player.ID].Spree+"!");
622 local reward = random(300, 3000);
623 AddCash(player, reward);
624 PrivMessage(player, "Received $"+reward+" as spree reward.");
625 }
626}