Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Wklejka 24fjqs21at5m dodana przez Maniuś1988, 01.07.2014 20:37
Typ:



Statsx_shell
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
403.
404.
405.
406.
407.
408.
409.
410.
411.
412.
413.
414.
415.
416.
417.
418.
419.
420.
421.
422.
423.
424.
425.
426.
427.
428.
429.
430.
431.
432.
433.
434.
435.
436.
437.
438.
439.
440.
441.
442.
443.
444.
445.
446.
447.
448.
449.
450.
451.
452.
453.
454.
455.
456.
457.
458.
459.
460.
461.
462.
463.
464.
465.
466.
467.
468.
469.
470.
471.
472.
473.
474.
475.
476.
477.
478.
479.
480.
481.
482.
483.
484.
485.
486.
487.
488.
489.
490.
491.
492.
493.
494.
495.
496.
497.
498.
499.
500.
501.
502.
503.
504.
505.
506.
507.
508.
509.
510.
511.
512.
513.
514.
515.
516.
517.
518.
519.
520.
521.
522.
523.
524.
525.
526.
527.
528.
529.
530.
531.
532.
533.
534.
535.
536.
537.
538.
539.
540.
541.
542.
543.
544.
545.
546.
547.
548.
549.
550.
551.
552.
553.
554.
555.
556.
557.
558.
559.
560.
561.
562.
563.
564.
565.
566.
567.
568.
569.
570.
571.
572.
573.
574.
575.
576.
577.
578.
579.
580.
581.
582.
583.
584.
585.
586.
587.
588.
589.
590.
591.
592.
593.
594.
595.
596.
597.
598.
599.
600.
601.
602.
603.
604.
605.
606.
607.
608.
609.
610.
611.
612.
613.
614.
615.
616.
617.
618.
619.
620.
621.
622.
623.
624.
625.
626.
627.
628.
629.
630.
631.
632.
633.
634.
635.
636.
637.
638.
639.
640.
641.
642.
643.
644.
645.
646.
647.
648.
649.
650.
651.
652.
653.
654.
655.
656.
657.
658.
659.
660.
661.
662.
663.
664.
665.
666.
667.
668.
669.
670.
671.
672.
673.
674.
675.
676.
677.
678.
679.
680.
681.
682.
683.
684.
685.
686.
687.
688.
689.
690.
691.
692.
693.
694.
695.
696.
697.
698.
699.
700.
701.
702.
703.
704.
705.
706.
707.
708.
709.
710.
711.
712.
713.
714.
715.
716.
717.
718.
719.
720.
721.
722.
723.
724.
725.
726.
727.
728.
729.
730.
731.
732.
733.
734.
735.
736.
737.
738.
739.
740.
741.
742.
743.
744.
745.
746.
747.
748.
749.
750.
751.
752.
753.
754.
755.
756.
757.
758.
759.
760.
761.
762.
763.
764.
765.
766.
767.
768.
769.
770.
771.
772.
773.
774.
775.
776.
777.
778.
779.
780.
781.
782.
783.
784.
785.
786.
787.
788.
789.
790.
791.
792.
793.
794.
795.
796.
797.
798.
799.
800.
801.
802.
803.
804.
805.
806.
807.
808.
809.
810.
811.
812.
813.
814.
815.
816.
817.
818.
819.
820.
821.
822.
823.
824.
825.
826.
827.
828.
829.
830.
831.
832.
833.
834.
835.
836.
837.
838.
839.
840.
841.
842.
843.
844.
845.
846.
847.
848.
849.
850.
851.
852.
853.
854.
855.
856.
857.
858.
859.
860.
861.
862.
863.
864.
865.
866.
867.
868.
869.
870.
871.
872.
873.
874.
875.
876.
877.
878.
879.
880.
881.
882.
883.
884.
885.
886.
887.
888.
889.
890.
891.
892.
893.
894.
895.
896.
897.
898.
899.
900.
901.
902.
903.
904.
905.
906.
907.
908.
909.
910.
911.
912.
913.
914.
915.
916.
917.
918.
919.
920.
921.
922.
923.
924.
925.
926.
927.
928.
929.
930.
931.
932.
933.
934.
935.
936.
937.
938.
939.
940.
941.
942.
943.
944.
945.
946.
947.
948.
949.
950.
951.
952.
953.
954.
955.
956.
957.
958.
959.
960.
961.
962.
963.
964.
965.
966.
967.
968.
969.
970.
971.
972.
973.
974.
975.
976.
977.
978.
979.
980.
981.
982.
983.
984.
985.
986.
987.
988.
989.
990.
991.
992.
993.
994.
995.
996.
997.
998.
999.
1000.
1001.
1002.
1003.
1004.
1005.
1006.
1007.
1008.
1009.
1010.
1011.
1012.
1013.
1014.
1015.
1016.
1017.
1018.
1019.
1020.
1021.
1022.
1023.
1024.
1025.
1026.
1027.
1028.
1029.
1030.
1031.
1032.
1033.
1034.
1035.
1036.
1037.
1038.
1039.
1040.
1041.
1042.
1043.
1044.
1045.
1046.
1047.
1048.
1049.
1050.
1051.
1052.
1053.
1054.
1055.
1056.
1057.
1058.
1059.
1060.
1061.
1062.
1063.
1064.
1065.
1066.
1067.
1068.
1069.
1070.
1071.
1072.
1073.
1074.
1075.
1076.
1077.
1078.
1079.
1080.
1081.
1082.
1083.
1084.
1085.
1086.
1087.
1088.
1089.
1090.
1091.
1092.
1093.
1094.
1095.
1096.
1097.
1098.
1099.
1100.
1101.
1102.
1103.
1104.
1105.
1106.
1107.
1108.
1109.
1110.
1111.
1112.
1113.
1114.
1115.
1116.
1117.
1118.
1119.
1120.
1121.
1122.
1123.
1124.
1125.
1126.
1127.
1128.
1129.
1130.
1131.
1132.
1133.
1134.
1135.
1136.
1137.
1138.
1139.
1140.
1141.
1142.
1143.
1144.
1145.
1146.
1147.
1148.
1149.
1150.
1151.
1152.
1153.
1154.
1155.
1156.
1157.
1158.
1159.
1160.
1161.
1162.
1163.
1164.
1165.
1166.
1167.
1168.
1169.
1170.
1171.
1172.
1173.
1174.
1175.
1176.
1177.
1178.
1179.
1180.
1181.
1182.
1183.
1184.
1185.
1186.
1187.
1188.
1189.
1190.
1191.
1192.
1193.
1194.
1195.
1196.
1197.
1198.
1199.
1200.
1201.
1202.
1203.
1204.
1205.
1206.
1207.
1208.
1209.
1210.
1211.
1212.
1213.
1214.
1215.
1216.
1217.
1218.
1219.
1220.
1221.
1222.
1223.
1224.
1225.
1226.
1227.
1228.
1229.
1230.
1231.
1232.
1233.
1234.
1235.
1236.
1237.
1238.
1239.
1240.
1241.
1242.
1243.
1244.
1245.
1246.
1247.
1248.
1249.
1250.
1251.
1252.
1253.
1254.
1255.
1256.
1257.
1258.
1259.
1260.
1261.
1262.
1263.
1264.
1265.
1266.
1267.
1268.
1269.
1270.
1271.
1272.
1273.
1274.
1275.
1276.
1277.
1278.
1279.
1280.
1281.
1282.
1283.
1284.
1285.
1286.
1287.
1288.
1289.
1290.
1291.
1292.
1293.
1294.
1295.
1296.
1297.
1298.
1299.
1300.
1301.
1302.
1303.
1304.
1305.
1306.
1307.
1308.
1309.
1310.
1311.
1312.
1313.
1314.
1315.
1316.
1317.
1318.
1319.
1320.
1321.
1322.
1323.
1324.
1325.
1326.
1327.
1328.
1329.
1330.
1331.
1332.
1333.
1334.
1335.
1336.
1337.
1338.
1339.
1340.
1341.
1342.
1343.
1344.
1345.
1346.
1347.
1348.
1349.
1350.
1351.
1352.
1353.
1354.
1355.
1356.
1357.
1358.
1359.
1360.
1361.
1362.
1363.
1364.
1365.
1366.
1367.
1368.
1369.
1370.
1371.
1372.
1373.
1374.
1375.
1376.
1377.
1378.
1379.
1380.
1381.
1382.
1383.
1384.
1385.
1386.
1387.
1388.
1389.
1390.
1391.
1392.
1393.
1394.
1395.
1396.
1397.
1398.
1399.
1400.
1401.
1402.
1403.
1404.
1405.
1406.
1407.
1408.
1409.
1410.
1411.
1412.
1413.
1414.
1415.
1416.
1417.
1418.
1419.
1420.
1421.
1422.
1423.
1424.
1425.
1426.
1427.
1428.
1429.
1430.
1431.
1432.
1433.
1434.
1435.
1436.
1437.
1438.
1439.
1440.
1441.
1442.
1443.
1444.
1445.
1446.
1447.
1448.
1449.
1450.
1451.
1452.
1453.
1454.
1455.
1456.
1457.
1458.
1459.
1460.
1461.
1462.
1463.
1464.
1465.
1466.
1467.
1468.
1469.
1470.
1471.
1472.
1473.
1474.
1475.
1476.
1477.
1478.
1479.
1480.
1481.
1482.
1483.
1484.
1485.
1486.
1487.
1488.
1489.
1490.
1491.
1492.
1493.
1494.
1495.
1496.
1497.
1498.
1499.
1500.
1501.
1502.
1503.
1504.
1505.
1506.
1507.
1508.
1509.
1510.
1511.
1512.
1513.
1514.
1515.
1516.
1517.
1518.
1519.
1520.
1521.
1522.
1523.
1524.
1525.
1526.
1527.
1528.
1529.
1530.
1531.
1532.
1533.
1534.
1535.
1536.
1537.
1538.
1539.
1540.
1541.
1542.
1543.
1544.
1545.
1546.
1547.
1548.
1549.
1550.
1551.
1552.
1553.
1554.
1555.
1556.
1557.
1558.
1559.
1560.
1561.
1562.
1563.
1564.
1565.
1566.
1567.
1568.
1569.
1570.
1571.
1572.
1573.
1574.
1575.
1576.
1577.
1578.
1579.
1580.
1581.
1582.
1583.
1584.
1585.
1586.
1587.
1588.
1589.
1590.
1591.
1592.
1593.
1594.
1595.
1596.
1597.
1598.
1599.
1600.
1601.
1602.
1603.
1604.
1605.
1606.
1607.
1608.
1609.
1610.
1611.
1612.
1613.
1614.
1615.
1616.
1617.
1618.
1619.
1620.
1621.
/*
*================================
* Название: statsx_shell
* Версия : 2.0.0 (BETA)
* Код: AMX Dev Team
* Доработка: MastaMan
* ----------------------
* Доступные языки: RU, UA, EN
* 
* Источник: http://amx-server.blogspot.com
* ================================
*/
/* AMX Mod X
*  StatsX Plugin
*
* by the AMX Mod X Development Team
*  originally developed by OLO
*
* This file is part of AMX Mod X.
*
*
*  This program is free software; you can redistribute it and/or modify it
*  under the terms of the GNU General Public License as published by the
*  Free Software Foundation; either version 2 of the License, or (at
*  your option) any later version.
*
*  This program is distributed in the hope that it will be useful, but
*  WITHOUT ANY WARRANTY; without even the implied warranty of
*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
*  General Public License for more details.
*
*  You should have received a copy of the GNU General Public License
*  along with this program; if not, write to the Free Software Foundation, 
*  Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*  In addition, as a special exception, the author gives permission to
*  link the code of this program with the Half-Life Game Engine ("HL
*  Engine") and Modified Game Libraries ("MODs") developed by Valve, 
*  L.L.C ("Valve"). You must obey the GNU General Public License in all
*  respects for all of the code used other than the HL Engine and MODs
*  from Valve. If you modify this file, you may extend this exception
*  to your version of the file, but you are not obligated to do so. If
*  you do not wish to do so, delete this exception statement from your
*  version.
*/
 
//--------------------------------
#include <amxmodx>
#include <amxmisc>
#include <csx>
#include <cstrike>
#include <nvault>
 
#define STATSX_SHELL_VER "2.0.0 (BETA)"
//--------------------------------
 
/*Color Chat*/
#define MAXSLOTS 32
 
enum ChatColor
{
	CHATCOLOR_NORMAL = 1,
	CHATCOLOR_GREEN,
	CHATCOLOR_TEAM_COLOR,
	CHATCOLOR_GREY, 	
	CHATCOLOR_RED, 		
	CHATCOLOR_BLUE, 	
}
 
new g_TeamName[][] = 
{
	"",
	"TERRORIST",
	"CT",
	"SPECTATOR"
}
 
new g_msgSayText
new g_msgTeamInfo
 
// Uncomment to activate log debug messages.
//#define STATSX_DEBUG
 
// HUD statistics duration in seconds (minimum 1.0 seconds).
#define HUD_DURATION_CVAR   "amx_statsx_duration"
#define HUD_DURATION        "12.0"
 
// HUD statistics stop relative freeze end in seconds.
// To stop before freeze end use a negative value.
#define HUD_FREEZE_LIMIT_CVAR   "amx_statsx_freeze"
#define HUD_FREEZE_LIMIT        "-2.0"
 
// HUD statistics minimum duration, in seconds, to trigger the display logic.
#define HUD_MIN_DURATION    0.2
 
// Config plugin constants.
#define MODE_HUD_DELAY      0   // Make a 0.01 sec delay on HUD reset process.
 
// You can also manualy enable or disable these options by setting them to 1
// For example:
// public ShowAttackers = 1
// However amx_statscfg command is recommended
 
public KillerChat           = 0 // displays killer hp&ap to victim console 
                                // and screen
 
public ShowAttackers        = 0 // shows attackers
public ShowVictims          = 0 // shows victims
public ShowKiller           = 0 // shows killer
public ShowTeamScore        = 0 // shows team score at round end
public ShowTotalStats       = 0 // shows round total stats
public ShowBestScore        = 0 // shows rounds best scored player
public ShowMostDisruptive   = 0 // shows rounds most disruptive player
 
public EndPlayer            = 0 // displays player stats at the end of map
public EndTop15             = 0 // displays top15 at the end of map
 
public SayHP                = 0 // displays information about user killer
public SayStatsMe           = 0 // displays user's stats and rank
public SayRankStats         = 0 // displays user's rank stats
public SayMe                = 0 // displays user's stats
public SayRank              = 0 // displays user's rank
public SayReport            = 0 // report user's weapon status to team
public SayScore             = 0 // displays team's map score
public SayTop15             = 0 // displays first 15 players
public SayStatsAll          = 0 // displays all players stats and rank
 
public ShowStats            = 1 // set client HUD-stats switched off by default
public ShowDistHS           = 0 // show distance and HS in attackers and
                                //  victims HUD lists
public ShowFullStats        = 0 // show full HUD stats (more than 78 chars)
 
public SpecRankInfo         = 0 // displays rank info when spectating
 
// Standard Contstants.
#define MAX_TEAMS               2
#define MAX_PLAYERS             32 + 1
 
#define MAX_NAME_LENGTH         128
#define MAX_WEAPON_LENGTH       31
#define MAX_TEXT_LENGTH         255
#define MAX_BUFFER_LENGTH       2047
 
// User stats parms id
#define STATS_KILLS             0
#define STATS_DEATHS            1
#define STATS_HS                2
#define STATS_TKS               3
#define STATS_SHOTS             4
#define STATS_HITS              5
#define STATS_DAMAGE            6
 
// Global player flags.
new BODY_PART[8][] =
{
	"WHOLEBODY", 
	"HEAD", 
	"CHEST", 
	"STOMACH", 
	"LEFTARM", 
	"RIGHTARM", 
	"LEFTLEG", 
	"RIGHTLEG"
}
 
new MM_BODY_PART[8][] =
{
	"WHOLEBODY", 
	"HEAD", 
	"CHEST", 
	"STOMACH", 
	"MM_LEFTARM", 
	"MM_RIGHTARM", 
	"MM_LEFTLEG", 
	"MM_RIGHTLEG"
}
 
// Killer information, save killer info at the time when player is killed.
#define KILLED_KILLER_ID        0   // Killer userindex/user-ID
#define KILLED_KILLER_HEALTH    1   // Killer's health
#define KILLED_KILLER_ARMOUR    2   // Killer's armour
#define KILLED_TEAM             3   // Killer's team
#define KILLED_KILLER_STATSFIX  4   // Fix to register the last hit/kill
 
new g_izKilled[MAX_PLAYERS][5]
 
// Menu variables and configuration
#define MAX_PPL_MENU_ACTIONS    2   // Number of player menu actions
#define PPL_MENU_OPTIONS        7   // Number of player options per displayed menu
 
new g_iPluginMode                                   = 0
 
new g_izUserMenuPosition[MAX_PLAYERS]               = {0, ...}
new g_izUserMenuAction[MAX_PLAYERS]                 = {0, ...}
new g_izUserMenuPlayers[MAX_PLAYERS][32]
 
new g_izSpecMode[MAX_PLAYERS]                       = {0, ...}
 
new g_izShowStatsFlags[MAX_PLAYERS]                 = {0, ...}
new g_izStatsSwitch[MAX_PLAYERS]                    = {0, ...}
new Float:g_fzShowUserStatsTime[MAX_PLAYERS]        = {0.0, ...}
new Float:g_fShowStatsTime                          = 0.0
new Float:g_fFreezeTime                             = 0.0
new Float:g_fFreezeLimitTime                        = 0.0
new Float:g_fHUDDuration                            = 0.0
 
new g_iRoundEndTriggered                            = 0
new g_iRoundEndProcessed                            = 0
 
new Float:g_fStartGame                              = 0.0
new g_izTeamScore[MAX_TEAMS]                        = {0, ...}
new g_izTeamEventScore[MAX_TEAMS]                   = {0, ...}
new g_izTeamRndStats[MAX_TEAMS][8]
new g_izTeamGameStats[MAX_TEAMS][8]
new g_izUserUserID[MAX_PLAYERS]                     = {0, ...}
new g_izUserAttackerDistance[MAX_PLAYERS]           = {0, ...}
new g_izUserVictimDistance[MAX_PLAYERS][MAX_PLAYERS]
new g_izUserRndName[MAX_PLAYERS][MAX_NAME_LENGTH + 1]
new g_izUserRndStats[MAX_PLAYERS][8]
new g_izUserGameStats[MAX_PLAYERS][8]
 
// Common buffer to improve performance, as Small always zero-initializes all vars
new g_sBuffer[MAX_BUFFER_LENGTH + 1]                = ""
new g_sScore[MAX_TEXT_LENGTH + 1]                   = ""
new g_sAwardAndScore[MAX_BUFFER_LENGTH + 1]         = ""
 
new t_sText[MAX_TEXT_LENGTH + 1]                    = ""
new t_sName[MAX_NAME_LENGTH + 1]                    = ""
new t_sWpn[MAX_WEAPON_LENGTH + 1]                   = ""
 
new g_HudSync_EndRound
new g_HudSync_SpecInfo
 
// MastaMan Edition
 
#define MAX_SORT_COUNT		100
 
#define MM_MINUTE 60
#define MM_HOUR 3600
#define MM_DAY 86400
#define MM_WEEK 604800
#define MM_MONTH 2592000
#define MM_YEAR 31536000
 
new bool:szTrigger = true
 
new iTopX, iTopEnd, iAwardID, iDesign, g_Vault, g_Vault2
 
new pcvar_statsmarquee, pcvar_statsmarquee_effect, pcvar_statsmarquee_color, pcvar_statsmarquee_position
new pcvar_award,  pcvar_award_anonce_chat, pcvar_award_chance, pcvar_award_cash, pcvar_dmg, pcvar_hs, pcvar_bot, pcvar_topx
new pcvar_style, pcvar_design, pcvar_day, pcvar_connect_message, pcvar_hostname, pcvar_connect_message_effect, pcvar_connect_message_color
new pcvar_pt, pcvar_pt_bonus, pcvar_pt_bonus_1h, pcvar_pt_bonus_2h, pcvar_pt_bonus_3h, pcvar_pt_bonus_4h, pcvar_pt_bonus_5h
new pcvar_pt_bonus_anonce, pcvar_connect_message_visit
 
new marquee_iID
 
new m_sName[MAX_NAME_LENGTH + 1]                  	= ""
new marquee_place[40]				= ""
 
new g_Statsx_Shell_Cvars[31][] =
{
	"csstats_rank",
	"csstats_maxsize",
	"amx_statsx_duration",
	"amx_statsx_freeze",
	"amx_statsx_shell_mode",
	"amx_statsx_design",
	"amx_statsx_marquee_enabled",
	"amx_statsx_marquee_effect",
	"amx_statsx_marquee_color",
	"amx_statsx_marquee_position",
	"amx_statsx_top_dmg_enabled",
	"amx_statsx_top_hs_enabled",
	"amx_statsx_top_bot_enabled",
	"amx_statsx_top_topx_enabled",
	"amx_statsx_award_enabled",
	"amx_statsx_award_cash",
	"amx_statsx_award_chance",
	"amx_statsx_award_anonce",
	"amx_statsx_day_stat",
	"amx_statsx_pt_enabled",
	"amx_statsx_pt_bonus",
	"amx_statsx_pt_bonus_anonce",
	"amx_statsx_pt_bonus_1h",
	"amx_statsx_pt_bonus_2h",
	"amx_statsx_pt_bonus_3h",
	"amx_statsx_pt_bonus_4h",
	"amx_statsx_pt_bonus_5h",
	"amx_statsx_conn_msg_enabled",
	"amx_statsx_conn_msg_effect",
	"amx_statsx_conn_msg_color",
	"amx_statsx_conn_msg_visit"
}
 
// Themes
 
#define STATSX_SHELL_DESIGN_MAX 13
 
#define STATSX_SHELL_DESIGN1_STYLE "<meta charset=UTF-8><style>body{background:#112233;font-family:Arial}th{background:#558866;color:#FFF;padding:10px 2px;text-align:left}td{padding:4px 3px}table{background:#EEEECC;font-size:12px;font-family:Arial}h2,h3{color:#FFF;font-family:Verdana}#c{background:#E2E2BC}img{height:10px;background:#09F;margin:0 3px}#r{height:10px;background:#B6423C}#clr{background:none;color:#FFF;font-size:20px}</style>"
#define STATSX_SHELL_DESIGN2_STYLE "<meta charset=UTF-8><style>body{font-family:Arial}th{background:#575757;color:#FFF;padding:5px;border-bottom:2px #BCE27F solid;text-align:left}td{padding:3px;border-bottom:1px #E7F0D0 solid}table{color:#3C9B4A;background:#FFF;font-size:12px}h2,h3{color:#333;font-family:Verdana}#c{background:#F0F7E2}img{height:10px;background:#62B054;margin:0 3px}#r{height:10px;background:#717171}#clr{background:none;color:#575757;font-size:20px}</style>"
#define STATSX_SHELL_DESIGN3_STYLE "<meta charset=UTF-8><style>body{background:#E6E6E6;font-family:Verdana}th{background:#F5F5F5;color:#A70000;padding:6px;text-align:left}td{padding:2px 6px}table{color:#333;background:#E6E6E6;font-size:10px;font-family:Georgia;border:2px solid #D9D9D9}h2,h3{color:#333;}#c{background:#FFF}img{height:10px;background:#14CC00;margin:0 3px}#r{height:10px;background:#CC8A00}#clr{background:none;color:#A70000;font-size:20px;border:0}</style>"
#define STATSX_SHELL_DESIGN4_STYLE "<meta charset=UTF-8><style>body{background:#E8EEF7;margin:2px;font-family:Tahoma}th{color:#0000CC;padding:3px}tr{text-align:left;background:#E8EEF7}td{padding:3px}table{background:#CCC;font-size:11px}h2,h3{font-family:Verdana}img{height:10px;background:#09F;margin:0 3px}#r{height:10px;background:#B6423C}#clr{background:none;color:#000;font-size:20px}</style>"
#define STATSX_SHELL_DESIGN5_STYLE "<meta charset=UTF-8><style>body{background:#555;font-family:Arial}th{border-left:1px solid #ADADAD;border-top:1px solid #ADADAD}table{background:#3C3C3C;font-size:11px;color:#FFF;border-right:1px solid #ADADAD;border-bottom:1px solid #ADADAD;padding:3px}h2,h3{color:#FFF}#c{background:#FF9B00;color:#000}img{height:10px;background:#00E930;margin:0 3px}#r{height:10px;background:#B6423C}#clr{background:none;color:#FFF;font-size:20px;border:0}</style>"
#define STATSX_SHELL_DESIGN6_STYLE "<meta charset=UTF-8><style>body{background:#FFF;font-family:Tahoma}th{background:#303B4A;color:#FFF}table{padding:6px 2px;background:#EFF1F3;font-size:12px;color:#222;border:1px solid #CCC}h2,h3{color:#222}#c{background:#E9EBEE}img{height:7px;background:#F8931F;margin:0 3px}#r{height:7px;background:#D2232A}#clr{background:none;color:#303B4A;font-size:20px;border:0}</style>"
#define STATSX_SHELL_DESIGN7_STYLE "<meta charset=UTF-8><style>body{background:#FFF;font-family:Verdana}th{background:#2E2E2E;color:#FFF;text-align:left}table{padding:6px 2px;background:#FFF;font-size:11px;color:#333;border:1px solid #CCC}h2,h3{color:#333}#c{background:#F0F0F0}img{height:7px;background:#444;margin:0 3px}#r{height:7px;background:#999}#clr{background:none;color:#2E2E2E;font-size:20px;border:0}</style>"
#define STATSX_SHELL_DESIGN8_STYLE "<meta charset=UTF-8><style>body{background:#242424;margin:20px;font-family:Tahoma}th{background:#2F3034;color:#BDB670;text-align:left} table{padding:4px;background:#4A4945;font-size:10px;color:#FFF}h2,h3{color:#D2D1CF}#c{background:#3B3C37}img{height:12px;background:#99CC00;margin:0 3px}#r{height:12px;background:#999900}#clr{background:none;color:#FFF;font-size:20px}</style>"
#define STATSX_SHELL_DESIGN9_STYLE "<meta charset=UTF-8><style>body{background:#FFF;font-family:Tahoma}th{background:#056B9E;color:#FFF;padding:3px;text-align:left;border-top:4px solid #3986AC}td{padding:2px 6px}table{color:#006699;background:#FFF;font-size:12px;border:2px solid #006699}h2,h3{color:#F69F1C;}#c{background:#EFEFEF}img{height:5px;background:#1578D3;margin:0 3px}#r{height:5px;background:#F49F1E}#clr{background:none;color:#056B9E;font-size:20px;border:0}</style>"
#define STATSX_SHELL_DESIGN10_STYLE "<meta charset=UTF-8><style>body{background:#4C5844;font-family:Tahoma}th{background:#1E1E1E;color:#C0C0C0;padding:2px;text-align:left;}td{padding:2px 10px}table{color:#AAC0AA;background:#424242;font-size:13px}h2,h3{color:#C2C2C2;font-family:Tahoma}#c{background:#323232}img{height:3px;background:#B4DA45;margin:0 3px}#r{height:3px;background:#6F9FC8}#clr{background:none;color:#FFF;font-size:20px}</style>"
#define STATSX_SHELL_DESIGN11_STYLE "<meta charset=UTF-8><style>body{background:#F2F2F2;font-family:Arial}th{background:#175D8B;color:#FFF;padding:7px;text-align:left}td{padding:3px;border-bottom:1px #BFBDBD solid}table{color:#153B7C;background:#F4F4F4;font-size:11px;border:1px solid #BFBDBD}h2,h3{color:#153B7C}#c{background:#ECECEC}img{height:8px;background:#54D143;margin:0 3px}#r{height:8px;background:#C80B0F}#clr{background:none;color:#175D8B;font-size:20px;border:0}</style>"
#define STATSX_SHELL_DESIGN12_STYLE "<meta charset=UTF-8><style>body{background:#283136;font-family:Arial}th{background:#323B40;color:#6ED5FF;padding:10px 2px;text-align:left}td{padding:4px 3px;border-bottom:1px solid #DCDCDC}table{background:#EDF1F2;font-size:10px;border:2px solid #505A62}h2,h3{color:#FFF}img{height:10px;background:#A7CC00;margin:0 3px}#r{height:10px;background:#CC3D00}#clr{background:none;color:#6ED5FF;font-size:20px;border:0}</style>"
#define STATSX_SHELL_DESIGN13_STYLE "<meta charset=UTF-8><style>body{background:#220000;font-family:Tahoma}th{background:#3E0909;color:#FFF;padding:5px 2px;text-align:left;border-bottom:1px solid #DEDEDE}td{padding:2px 2px;}table{background:#FFF;font-size:11px;border:1px solid #791616}h2,h3{color:#FFF}#c{background:#F4F4F4;color:#7B0000}img{height:7px;background:#a00000;margin:0 3px}#r{height:7px;background:#181818}#clr{background:none;color:#CFCFCF;font-size:20px;border:0}</style>"
 
#define STATSX_SHELL_DEFAULT_STYLE "<meta charset=UTF-8><style>body{background:#000}tr{text-align:left}table{font-size:13px;color:#FFB000;padding:2px}h2,h3{color:#FFF;font-family:Verdana}img{height:5px;background:#0000FF;margin:0 3px}#r{height:5px;background:#FF0000}</style>"
 
 
//--------------------------------
// Initialize
//--------------------------------
public plugin_init()
{
	// Register plugin.
	register_plugin("StatsX (MastaMan Edition)", AMXX_VERSION_STR, "AMXX Dev Team")
	register_dictionary("statsx_shell.txt")
 
	register_cvar("statsx_shell_ver", STATSX_SHELL_VER, FCVAR_SPONLY | FCVAR_SERVER)
 
	//Stats Marquee
	set_task(15.0, "StatsMarquee", 0, _, 0)
 
	// Random award ID
	//iAwardID = random_num(0,9)
 
	// Random design
	iDesign = random_num(1, STATSX_SHELL_DESIGN_MAX)
 
	pcvar_hostname = get_cvar_pointer("hostname")
 
	pcvar_style = register_cvar("amx_statsx_shell_mode", "1")
	pcvar_design = register_cvar("amx_statsx_design", "1")
 
	pcvar_statsmarquee = register_cvar("amx_statsx_marquee_enabled", "1")
	pcvar_statsmarquee_effect = register_cvar("amx_statsx_marquee_effect", "0")
	pcvar_statsmarquee_color = register_cvar("amx_statsx_marquee_color", "0")
	pcvar_statsmarquee_position = register_cvar("amx_statsx_marquee_position", "0")
 
	pcvar_dmg = register_cvar("amx_statsx_top_dmg_enabled", "1")
 
	pcvar_hs = register_cvar("amx_statsx_top_hs_enabled", "1")
 
	pcvar_bot = register_cvar("amx_statsx_top_bot_enabled", "1")
 
	pcvar_topx = register_cvar("amx_statsx_top_topx_enabled", "1")
 
	pcvar_award = register_cvar("amx_statsx_award_enabled", "1")
	pcvar_award_cash = register_cvar("amx_statsx_award_cash", "1000")
	pcvar_award_chance = register_cvar("amx_statsx_award_chance", "0.1")
	pcvar_award_anonce_chat = register_cvar("amx_statsx_award_anonce", "1")
 
	pcvar_day = register_cvar("amx_statsx_day_stat", "1")
 
	pcvar_pt = register_cvar("amx_statsx_pt_enabled", "1")
	pcvar_pt_bonus = register_cvar("amx_statsx_pt_bonus", "1")
	pcvar_pt_bonus_anonce = register_cvar("amx_statsx_pt_bonus_anonce", "1")
	pcvar_pt_bonus_1h = register_cvar("amx_statsx_pt_bonus_1h", "250")
	pcvar_pt_bonus_2h = register_cvar("amx_statsx_pt_bonus_2h", "500")
	pcvar_pt_bonus_3h = register_cvar("amx_statsx_pt_bonus_3h", "1000")
	pcvar_pt_bonus_4h = register_cvar("amx_statsx_pt_bonus_4h", "2000")
	pcvar_pt_bonus_5h = register_cvar("amx_statsx_pt_bonus_5h", "5000")
 
	pcvar_connect_message = register_cvar("amx_statsx_conn_msg_enabled", "1")
	pcvar_connect_message_effect = register_cvar("amx_statsx_conn_msg_effect", "0")
	pcvar_connect_message_color = register_cvar("amx_statsx_conn_msg_color", "0")
	pcvar_connect_message_visit = register_cvar("amx_statsx_conn_msg_visit", "1")
 
 
	// Register events.
	register_event("TextMsg", "eventStartGame", "a", "2=#Game_Commencing", "2=#Game_will_restart_in")
	register_event("ResetHUD", "eventResetHud", "be")
	register_event("RoundTime", "eventStartRound", "bc")
	register_event("SendAudio", "eventEndRound", "a", "2=%!MRAD_terwin", "2=%!MRAD_ctwin", "2=%!MRAD_rounddraw")
	register_event("TeamScore", "eventTeamScore", "a")
	register_event("30", "eventIntermission", "a")
	register_event("TextMsg", "eventSpecMode", "bd", "2&ec_Mod")
	register_event("StatusValue", "eventShowRank", "bd", "1=2")
 
	// Register commands.
	register_clcmd("say /hp", "cmdHp", 0, "- display info. about your killer (chat)")
	register_clcmd("say /statsme", "cmdStatsMe", 0, "- display your stats (MOTD)")
	register_clcmd("say /rankstats", "cmdRankStats", 0, "- display your server stats (MOTD)")
	register_clcmd("say /me", "cmdMe", 0, "- display current round stats (chat)")
	register_clcmd("say /score", "cmdScore", 0, "- display last score (chat)")
	register_clcmd("say /rank", "cmdRank", 0, "- display your rank (chat)")
	register_clcmd("say /report", "cmdReport", 0, "- display weapon status (say_team)")
	register_clcmd("say /stats", "cmdStats", 0, "- display players stats (menu/MOTD)")
	register_clcmd("say /switch", "cmdSwitch", 0, "- switch client's stats on or off")
	register_clcmd("say_team /hp", "cmdHp", 0, "- display info. about your killer (chat)")
	register_clcmd("say_team /statsme", "cmdStatsMe", 0, "- display your stats (MOTD)")
	register_clcmd("say_team /rankstats", "cmdRankStats", 0, "- display your server stats (MOTD)")
	register_clcmd("say_team /me", "cmdMe", 0, "- display current round stats (chat)")
	register_clcmd("say_team /score", "cmdScore", 0, "- display last score (chat)")
	register_clcmd("say_team /rank", "cmdRank", 0, "- display your rank (chat)")
	register_clcmd("say_team /report", "cmdReport", 0, "- display weapon status (say_team_team)")
	register_clcmd("say_team /stats", "cmdStats", 0, "- display players stats (menu/MOTD)")
	register_clcmd("say_team /switch", "cmdSwitch", 0, "- switch client's stats on or off")
	register_clcmd ("mmm_plugins" ,"mm_plugins", 0)
 
 
	register_clcmd("say /top15", "cmdPlace1", 0, "- display top 15 players (MOTD)")
	register_clcmd("say_team /top15", "cmdPlace1", 0, "- display top 15 players (MOTD)")
 
	// Register menus.
	register_menucmd(register_menuid("Server Stats"), 1023, "actionStatsMenu")
 
	// Register special configuration setting and default value.
	register_srvcmd("amx_statsx_mode", "cmdPluginMode", ADMIN_CFG, "<flags> - sets plugin options")
 
#if defined STATSX_DEBUG
	register_clcmd("say /hudtest", "cmdHudTest")
#endif
 
	register_cvar(HUD_DURATION_CVAR, HUD_DURATION)
	register_cvar(HUD_FREEZE_LIMIT_CVAR, HUD_FREEZE_LIMIT)
 
 
	// Init buffers and some global vars.
	g_sBuffer[0] = 0
	save_team_chatscore()
 
	g_HudSync_EndRound = CreateHudSyncObj()
	g_HudSync_SpecInfo = CreateHudSyncObj()
 
	g_msgSayText = get_user_msgid("SayText")
	g_msgTeamInfo = get_user_msgid("TeamInfo") 
}
 
public plugin_cfg()
{
	new addStast[] = "amx_statscfg add ^"%s^" %s"
 
	server_cmd(addStast, "ST_SHOW_KILLER_CHAT", "KillerChat")
	server_cmd(addStast, "ST_SHOW_ATTACKERS", "ShowAttackers")
	server_cmd(addStast, "ST_SHOW_VICTIMS", "ShowVictims")
	server_cmd(addStast, "ST_SHOW_KILLER", "ShowKiller")
	server_cmd(addStast, "ST_SHOW_TEAM_SCORE", "ShowTeamScore")
	server_cmd(addStast, "ST_SHOW_TOTAL_STATS", "ShowTotalStats")
	server_cmd(addStast, "ST_SHOW_BEST_SCORE", "ShowBestScore")
	server_cmd(addStast, "ST_SHOW_MOST_DISRUPTIVE", "ShowMostDisruptive")
	server_cmd(addStast, "ST_SHOW_HUD_STATS_DEF", "ShowStats")
	server_cmd(addStast, "ST_SHOW_DIST_HS_HUD", "ShowDistHS")
	server_cmd(addStast, "ST_STATS_PLAYER_MAP_END", "EndPlayer")
	server_cmd(addStast, "ST_STATS_TOP15_MAP_END", "EndTop15")
	server_cmd(addStast, "ST_SAY_HP", "SayHP")
	server_cmd(addStast, "ST_SAY_STATSME", "SayStatsMe")
	server_cmd(addStast, "ST_SAY_RANKSTATS", "SayRankStats")
	server_cmd(addStast, "ST_SAY_ME", "SayMe")
	server_cmd(addStast, "ST_SAY_RANK", "SayRank")
	server_cmd(addStast, "ST_SAY_REPORT", "SayReport")
	server_cmd(addStast, "ST_SAY_SCORE", "SayScore")
	server_cmd(addStast, "ST_SAY_TOP15", "SayTop15")
	server_cmd(addStast, "ST_SAY_STATS", "SayStatsAll")
	server_cmd(addStast, "ST_SPEC_RANK", "SpecRankInfo")
 
	// Update local configuration vars with value in cvars.
	get_config_cvars()
 
	//MastaMan Edition
 
	if(get_pcvar_num(pcvar_day))
	{
		g_Vault = nvault_open("statsx_shell_hour_attend")
 
		if(g_Vault == INVALID_HANDLE)
		{
			set_fail_state("Error opening nVault")
		}
	}
 
	if(get_pcvar_num(pcvar_pt))
	{
		g_Vault2 = nvault_open("statsx_shell_played_time")
 
		if(g_Vault2 == INVALID_HANDLE)
		{
			set_fail_state("Error opening nVault")
		}
 
		nvault_prune(g_Vault2 , 0 , get_systime() - (30 * 86400 ))
	}
 
	if(is_plugin_loaded("statsx.amxx", true) != -1)
	{
		server_cmd("amxx pause statsx.amxx")
	}
 
	new szCfgDir[MAX_TEXT_LENGTH], Time[9] 
	get_time("%H:%M:%S",Time,8)
 
	get_configsdir(szCfgDir, MAX_TEXT_LENGTH  - 1)
	formatex(szCfgDir, sizeof (szCfgDir) -1 , "%s/statsx_shell/statsx_shell.cfg", szCfgDir)
	server_cmd("exec %s", szCfgDir)
 
 
	server_print(" ")
	server_print("###############################################################################")
	server_print("^tTitle  : StatsX Shell (Ultimate StatsX)")
	server_print("^tVersion: %s", STATSX_SHELL_VER)
	server_print("^tAuthor : AMX MOD X DEV TEAM")
	server_print("^tEdited : MastaMan")
	server_print("^tSite   : http://amx-server.blogspot.com")
	server_print(" ")
	server_print("------------------------------------------------------------------------------")
	server_print(" ")
	if(file_exists(szCfgDir))
	{
		server_print("[%s] > Load settings from: statsx_shell.cfg", Time)
	}
	else
	{
		server_print("[%s] > Not found: statsx_shell.cfg ........................... [ERROR]", Time)
		server_print(" ")
		server_print("> Please reinstall plugin statsx_shell.amxx for ")
		server_print(" solve this problem or check your cfg!")
		server_print(" ")
		server_print("> Visit www.amx-server.blogspot.com for check new version and more info...")
		server_print(" ")
		server_print("###############################################################################")
 
		//log_amx("Not found: statsx_shell.cfg")
 
 
		return PLUGIN_CONTINUE
	}
	server_print(" ")
 
	new szData[MAX_TEXT_LENGTH], i
	new bool:bERROR_MESSAGE, szERROR_MESSAGE[70]
	new file = fopen(szCfgDir, "rt")
	while(!feof(file))
	{		
		new bool:g_bERROR_MESSAGE_TYPE1 = true
		new bool:g_bERROR_MESSAGE_TYPE2 = true
 
		fgets(file, szData, sizeof(szData) -1)
 
 
		if(szData[0] == '/' || szData[0] == ';' || strlen(szData) < 3)
		{
			continue
		}
 
		new param1[32], param2[32]
 
		parse(szData, param1, sizeof(param1), param2, sizeof(param2))
 
		////////////////////////////////////////////////
 
		for(new j = 0; j < sizeof(g_Statsx_Shell_Cvars); j++)
		{
			if(equali(param1, g_Statsx_Shell_Cvars[j]))
			{
				g_bERROR_MESSAGE_TYPE1 = false
			}
		}
 
		if(strlen(param2) < 1 || equali(param2, " "))
		{
			g_bERROR_MESSAGE_TYPE2 = true
		}
		else
		{
			g_bERROR_MESSAGE_TYPE2 = false
		}
 
		////////////////////////////////////////////////
 
		new szSpaceCount[128]
		new iLen = 0
 
		new iSpaceCount 
 
		////////////////////////////////////////////////
 
		if(!g_bERROR_MESSAGE_TYPE1)
		{						
			if(!g_bERROR_MESSAGE_TYPE2)
			{
 
				iLen = formatex(szERROR_MESSAGE, sizeof(szERROR_MESSAGE) - 1, "[%s] > Read cvar ^"%s^" ^"%s^" ", Time,param1, param2)
 
				iSpaceCount = sizeof(szERROR_MESSAGE) - iLen
 
				for(new k = 1; k < iSpaceCount; k ++)
				{
					iLen += formatex(szERROR_MESSAGE[iLen], sizeof(szERROR_MESSAGE) - iLen, ".")
				}
 
				server_print("%s%s%s", szERROR_MESSAGE, szSpaceCount, " [OK]")
				server_cmd("%s %s", param1, param2)
			}
			else
			{
				bERROR_MESSAGE = true
 
				iLen = formatex(szERROR_MESSAGE, sizeof(szERROR_MESSAGE) - 1, "[%s] > Bad value for ^"%s^" ", Time,param1)
 
				iSpaceCount = sizeof(szERROR_MESSAGE) - iLen
 
				for(new k = 1; k < iSpaceCount; k ++)
				{
					iLen += formatex(szERROR_MESSAGE[iLen], sizeof(szERROR_MESSAGE) - iLen, ".")
				}
 
				server_print("%s%s%s", szERROR_MESSAGE, szSpaceCount, " [ERROR]")
				//log_amx("Bad value for %s", param1)
			}
		}
		else
		{
			bERROR_MESSAGE = true
 
			iLen = formatex(szERROR_MESSAGE, sizeof(szERROR_MESSAGE) - 1, "[%s] > Unknown cvar ^"%s^" ", Time, param1)
 
			iSpaceCount = sizeof(szERROR_MESSAGE) - iLen
 
			for(new k = 1; k < iSpaceCount; k ++)
			{
				iLen += formatex(szERROR_MESSAGE[iLen], sizeof(szERROR_MESSAGE) - iLen, ".")
			}
 
			server_print("%s%s%s", szERROR_MESSAGE, szSpaceCount, " [ERROR]")
			//log_amx("Unknown cvar %s", param1)
		}
 
 
		i++
	}
 
	if(bERROR_MESSAGE)
	{
			server_print(" ")
			server_print("------------------------------------------------------------------------------")
			server_print(" ")
			server_print("[%s] > [!] WARNING: Read some cvar's from configuration failure!", Time)
			server_print("> Please check [ERROR] messages above...")
			server_print(" ")
			server_print("> Visit www.amx-server.blogspot.com for check new version and more info...")
 
	}
	else
	{
			server_print(" ")
			server_print("------------------------------------------------------------------------------")
			server_print(" ")
			server_print("[%s] > [OK] All settings load success!", Time)
	}
 
	fclose(file)	
 
	server_print(" ")
	server_print("###############################################################################")
 
	// MastaMan Edition
 
	if(get_pcvar_num(pcvar_style))
	{
		register_clcmd("say /top", "cmdPlace1", 0, "- display top 10 players (MOTD)")
		register_clcmd("say /place", "cmdPlace1", 0, "- display top 10 players (MOTD)")
		register_clcmd("say /1place", "cmdPlace1", 0, "- display top 10 players (MOTD)")
		register_clcmd("say /2place", "cmdPlace2", 0, "- display top 20 players (MOTD)")
		register_clcmd("say /3place", "cmdPlace3", 0, "- display top 30 players (MOTD)")
		register_clcmd("say /top1", "cmdPlace1", 0, "- display top 10 players (MOTD)")
		register_clcmd("say /top10", "cmdPlace1", 0, "- display top 10 players (MOTD)")
		register_clcmd("say /top2", "cmdPlace2", 0, "- display top 20 players (MOTD)")
		register_clcmd("say /top20", "cmdPlace2", 0, "- display top 20 players (MOTD)")
		register_clcmd("say /top3", "cmdPlace3", 0, "- display top 30 players (MOTD)")
		register_clcmd("say /top30", "cmdPlace3", 0, "- display top 30 players (MOTD)")
		register_clcmd("say /dmg", "cmdDmg", 0, "- display top 10 dmg players (MOTD)")
		register_clcmd("say /damage", "cmdDmg", 0, "- display top 10 dmg players (MOTD)")
		register_clcmd("say /hs", "cmdHs", 0, "- display top 10 hs players (MOTD)")
		register_clcmd("say /headshot", "cmdHs", 0, "- display top 10 hs players (MOTD)")
		register_clcmd("say /bot", "cmdBot10", 0, "- display top 10 bots (MOTD)")
		register_clcmd("say /bots", "cmdBot10", 0, "- display top 10 bots (MOTD)")
		register_clcmd("say /flop", "cmdBot10", 0, "- display top 10 bots (MOTD)")
		register_clcmd("say /flops", "cmdBot10", 0, "- display top 10 bots (MOTD)")
		register_clcmd("say /noob", "cmdBot10", 0, "- display top 10 bots (MOTD)")
		register_clcmd("say /noobs", "cmdBot10", 0, "- display top 10 bots (MOTD)")
		register_clcmd("say /lol", "cmdBot10", 0, "- display top 10 bots (MOTD)")
		register_clcmd("say /lols", "cmdBot10", 0, "- display top 10 bots (MOTD)")
		register_clcmd("say /award", "cmdAward", 0, "- display top 10 bots (MOTD)")
		register_clcmd("say", "cmdTopX")
		register_clcmd("say /day", "cmdDay")
		register_clcmd("say /attend", "cmdDay")
		register_clcmd("say /time", "cmdPlTime")
		register_clcmd("say /pt", "cmdPlTime")
	}
 
 
	return PLUGIN_CONTINUE
}
 
public plugin_end()
{
 
	if(get_pcvar_num(pcvar_day))
	{
		nvault_close(g_Vault)
	}
 
	if(get_pcvar_num(pcvar_pt))
	{
		nvault_close(g_Vault2)
	}
}
 
public client_putinserver(id)
{
	if(get_pcvar_num(pcvar_connect_message))
	{
		set_task(2.5, "connect_message_anonce", id)
	}
}
 
public connect_message_anonce(id)
{
	new szName[32], szKey[50], szData[128], szHUDMessage[512]
	new szHour[5], szDay[5], szMonth[5]
	new izStats[8], izBody[8], szHostname[64]
	new  iHour, iDay, iMonth
	new iLen = 0
	new iColor_R, iColor_G, iColor_B, g_pcvarColor
 
	format_time(szHour, sizeof(szHour) - 1, "%H")
	format_time(szDay, sizeof(szDay) - 1, "%d")
	format_time(szMonth, sizeof(szMonth) - 1, "%m")
 
	iHour = str_to_num(szHour)
	iDay = str_to_num(szDay)
	iMonth = str_to_num(szMonth)
 
 
	get_user_name(id, szName, sizeof(szName) - 1)
	formatex(szKey, sizeof(szKey) - 1, "LAST_VISIT#%s", szName)
 
	new g_iLastPT = get_pcvar_num(pcvar_pt)
	new g_iLastVisit = get_pcvar_num(pcvar_connect_message_visit)
 
 
	new iRank = get_user_stats(id, izStats, izBody)
	new iMax = get_statsnum()
	get_pcvar_string(pcvar_hostname, szHostname, sizeof(szHostname) - 1)   
 
	iLen = formatex(szHUDMessage, sizeof(szHUDMessage) - 1, "%L %s^n^n%L %L^n", LANG_SERVER, "MM_WELCOME", szHostname, LANG_SERVER, "YOUR", LANG_SERVER, "RANK_IS", iRank, iMax)
 
	if(g_iLastPT && g_iLastVisit)
	{
		new g_iNvault = nvault_get(g_Vault2, szKey, szData, sizeof(szData) - 1)
 
		new szTmpDay[5], szTmpMonth[5], szTmpYear[5], szTmpHour[5], szTmpMinute[5]
		parse(szData, szTmpDay, sizeof(szTmpDay), szTmpMonth, sizeof(szTmpMonth), szTmpYear, sizeof(szTmpYear), szTmpHour, sizeof(szTmpHour), szTmpMinute, sizeof(szTmpMinute))
 
		if(strlen(szTmpMinute) == 1)
		{
			formatex(szTmpMinute, sizeof(szTmpMinute) - 1, "0%s", szTmpMinute)
		}
 
		if(g_iNvault && iDay == str_to_num(szTmpDay) && iMonth == str_to_num(szTmpMonth) && (iHour - str_to_num(szTmpHour)) >= 1)
		{
			iLen += formatex(szHUDMessage[iLen], sizeof(szHUDMessage) - iLen, "%L %L %s:%s", LANG_SERVER, "MM_LAST_VISIT", LANG_SERVER, "MM_TODAY", szTmpHour, szTmpMinute)
		}
		if(g_iNvault && (iDay - str_to_num(szTmpDay)) == 1 && iMonth == str_to_num(szTmpMonth))
		{
			iLen += formatex(szHUDMessage[iLen], sizeof(szHUDMessage) - iLen, "%L %L %s:%s", LANG_SERVER, "MM_LAST_VISIT", LANG_SERVER, "MM_YESTERDAY", szTmpHour, szTmpMinute)
		}
		if(g_iNvault && (iDay - str_to_num(szTmpDay)) == 2 && iMonth == str_to_num(szTmpMonth))
		{
			iLen += formatex(szHUDMessage[iLen], sizeof(szHUDMessage) - iLen, "%L %L %s:%s", LANG_SERVER, "MM_LAST_VISIT", LANG_SERVER, "MM_DAY_BEFORE", szTmpHour, szTmpMinute)
		}
		if(g_iNvault && 2 < (iDay - str_to_num(szTmpDay)) <= 7 && iMonth == str_to_num(szTmpMonth))
		{
			iLen += formatex(szHUDMessage[iLen], sizeof(szHUDMessage) - iLen, "%L %d %L %L %s:%s", LANG_SERVER, "MM_LAST_VISIT", (iDay - str_to_num(szTmpDay)), LANG_SERVER, "MM_DAY", LANG_SERVER, "MM_BEFORE", szTmpHour, szTmpMinute)
		}
		if(g_iNvault && (iDay - str_to_num(szTmpDay)) > 7 && iMonth == str_to_num(szTmpMonth))
		{
			iLen += formatex(szHUDMessage[iLen], sizeof(szHUDMessage) - iLen, "%L %s.%s.%s %s:%s", LANG_SERVER, "MM_LAST_VISIT", szTmpDay, szTmpMonth, szTmpYear, szTmpHour, szTmpMinute)
		}
	}
 
	g_pcvarColor = get_pcvar_num(pcvar_connect_message_color)
 
	if(g_pcvarColor == 10)
	{
		g_pcvarColor = random_num(1, 8)
	}
 
	switch(g_pcvarColor)
	{
		case 1:
		{
			// RED
			iColor_R = 255
			iColor_G = 0
			iColor_B = 0
		}
 
		case 2:
		{
			// BLUE
			iColor_R = 0
			iColor_G = 0
			iColor_B = 255
		}
		case 3:
		{
			// YELLOW
			iColor_R = 255
			iColor_G = 255
			iColor_B = 0
		}
 
		case 4:
		{
			// CYAN
			iColor_R = 0
			iColor_G = 255
			iColor_B = 255
		}
 
		case 5:
		{
			// MAGENTA
			iColor_R = 255
			iColor_G = 0
			iColor_B = 255
		}
		case 6:
		{
			// ORANGE
			iColor_R = 255
			iColor_G = 128
			iColor_B = 0
		}
		case 7:
		{
			// VIOLET
			iColor_R = 0
			iColor_G = 128
			iColor_B = 255
		}
		case 8:
		{
			// GRAY
			iColor_R = 100
			iColor_G = 100
			iColor_B = 100
		}
		case 9:
		{
			// RANDOM
			iColor_R = random_num(0, 255)
			iColor_G = random_num(0, 255)
			iColor_B = random_num(0, 255)
		}
		default:
		{
			// GREEN
			iColor_R = 0
			iColor_G = 255
			iColor_B = 0
		}
	}
 
	new iEffect, Float:iFadeIn, Float:iFadeOut, Float:iHoldTime
	switch(get_pcvar_num(pcvar_connect_message_effect))
	{
		case 1:
		{
			iEffect = 1
			iFadeIn = 0.2
			iFadeOut = 0.2
			iHoldTime = 7.0
		}
		case 2:
		{
			iEffect = 2
			iFadeIn = 0.05
			iFadeOut = 0.5
			iHoldTime = 7.0
		}
		default:
		{
			iEffect = 0
			iFadeIn = 0.5
			iFadeOut = 0.5
			iHoldTime = 7.0
		}
	}
 
	set_hudmessage(iColor_R, iColor_G, iColor_B, 0.15, 0.40, iEffect, 0.1, iHoldTime, iFadeIn, iFadeOut, -1)
	show_hudmessage(id, "%s", szHUDMessage)
}
 
// Set hudmessage format.
set_hudtype_killer(Float:fDuration)
	set_hudmessage(220, 80, 0, 0.05, 0.15, 0, 6.0, fDuration, (fDuration >= g_fHUDDuration) ? 1.0 : 0.0, 1.0, -1)
 
set_hudtype_endround(Float:fDuration)
{
	set_hudmessage(100, 200, 0, 0.05, 0.55, 0, 0.02, fDuration, (fDuration >= g_fHUDDuration) ? 1.0 : 0.0, 1.0)
}
 
set_hudtype_attacker(Float:fDuration)
	set_hudmessage(220, 80, 0, 0.55, 0.35, 0, 6.0, fDuration, (fDuration >= g_fHUDDuration) ? 1.0 : 0.0, 1.0, -1)
 
set_hudtype_victim(Float:fDuration)
	set_hudmessage(0, 80, 220, 0.55, 0.60, 0, 6.0, fDuration, (fDuration >= g_fHUDDuration) ? 1.0 : 0.0, 1.0, -1)
 
set_hudtype_specmode()
{
	set_hudmessage(255, 255, 255, 0.02, 0.96, 2, 0.05, 0.1, 0.01, 3.0, -1)
}
 
#if defined STATSX_DEBUG
public cmdHudTest(id)
{
	new i, iLen
	iLen = 0
 
	for (i = 1; i < 20; i++)
		iLen += format(g_sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "....x....1....x....2....x....3....x....4....x....^n")
 
	set_hudtype_killer(50.0)
	show_hudmessage(id, "%s", g_sBuffer)
}
#endif
 
// Stats formulas
Float:accuracy(izStats[8])
{
	if (!izStats[STATS_SHOTS])
		return (0.0)
 
	return (100.0 * float(izStats[STATS_HITS]) / float(izStats[STATS_SHOTS]))
}
 
Float:effec(izStats[8])
{
	if (!izStats[STATS_KILLS])
		return (0.0)
 
	return (100.0 * float(izStats[STATS_KILLS]) / float(izStats[STATS_KILLS] + izStats[STATS_DEATHS]))
}
 
// Distance formula (metric)
Float:distance(iDistance)
{
	return float(iDistance) * 0.0254
}
 
// Get plugin config flags.
set_plugin_mode(id, sFlags[])
{
	if (sFlags[0])
		g_iPluginMode = read_flags(sFlags)
 
	get_flags(g_iPluginMode, t_sText, MAX_TEXT_LENGTH)
	console_print(id, "%L", id, "MODE_SET_TO", t_sText)
 
	return g_iPluginMode
}
 
// Get config parameters.
get_config_cvars()
{
	g_fFreezeTime = get_cvar_float("mp_freezetime")
 
	if (g_fFreezeTime < 0.0)
		g_fFreezeTime = 0.0
 
	g_fHUDDuration = get_cvar_float(HUD_DURATION_CVAR)
 
	if (g_fHUDDuration < 1.0)
		g_fHUDDuration = 1.0
 
	g_fFreezeLimitTime = get_cvar_float(HUD_FREEZE_LIMIT_CVAR)
}
 
// Get and format attackers header and list.
get_attackers(id, sBuffer[MAX_BUFFER_LENGTH + 1])
{
	new izStats[8], izBody[8]
	new iAttacker
	new iFound, iLen
	new iMaxPlayer = get_maxplayers()
 
	iFound = 0
	sBuffer[0] = 0
 
	// Get and format header. Add killing attacker statistics if user is dead.
	// Make sure shots is greater than zero or division by zero will occur.
	// To print a '%', 4 of them must done in a row.
	izStats[STATS_SHOTS] = 0
	iAttacker = g_izKilled[id][KILLED_KILLER_ID]
 
	if (iAttacker)
		get_user_astats(id, iAttacker, izStats, izBody)
 
	if (izStats[STATS_SHOTS] && ShowFullStats)
	{
		get_user_name(iAttacker, t_sName, MAX_NAME_LENGTH)
		iLen = format(sBuffer, MAX_BUFFER_LENGTH, "%L -- %s -- %0.2f%% %L:^n", id, "ATTACKERS", t_sName, accuracy(izStats), id, "ACC")
	}
	else
		iLen = format(sBuffer, MAX_BUFFER_LENGTH, "%L:^n", id, "ATTACKERS")
 
	// Get and format attacker list.
	for (iAttacker = 1; iAttacker <= iMaxPlayer; iAttacker++)
	{
		if (get_user_astats(id, iAttacker, izStats, izBody, t_sWpn, MAX_WEAPON_LENGTH))
		{
			iFound = 1
			get_user_name(iAttacker, t_sName, MAX_NAME_LENGTH)
 
			if (izStats[STATS_KILLS])
			{
				if (!ShowDistHS)
					iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "%s -- %d %L / %d %L / %s^n", t_sName, izStats[STATS_HITS], id, "HIT_S", 
									izStats[STATS_DAMAGE], id, "DMG", t_sWpn)
				else if (izStats[STATS_HS])
					iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "%s -- %d %L / %d %L / %s / %0.0f m / MM_HS^n", t_sName, izStats[STATS_HITS], id, "HIT_S", 
									izStats[STATS_DAMAGE], id, "DMG", t_sWpn, distance(g_izUserAttackerDistance[id]))
				else
					iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "%s -- %d %L / %d %L / %s / %0.0f m^n", t_sName, izStats[STATS_HITS], id, "HIT_S", 
									izStats[STATS_DAMAGE], id, "DMG", t_sWpn, distance(g_izUserAttackerDistance[id]))
			}
			else
				iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "%s -- %d %L / %d %L^n", t_sName, izStats[STATS_HITS], id, "HIT_S", izStats[STATS_DAMAGE], id, "DMG")
		}
	}
 
	if (!iFound)
		sBuffer[0] = 0
 
	return iFound
}
 
// Get and format victims header and list
get_victims(id, sBuffer[MAX_BUFFER_LENGTH + 1])
{
	new izStats[8], izBody[8]
	new iVictim
	new iFound, iLen
	new iMaxPlayer = get_maxplayers()
 
	iFound = 0
	sBuffer[0] = 0
 
	// Get and format header.
	// Make sure shots is greater than zero or division by zero will occur.
	// To print a '%', 4 of them must done in a row.
	izStats[STATS_SHOTS] = 0
	get_user_vstats(id, 0, izStats, izBody)
 
	if (izStats[STATS_SHOTS])
		iLen = format(sBuffer, MAX_BUFFER_LENGTH, "%L -- %0.2f%% %L:^n", id, "VICTIMS", accuracy(izStats), id, "ACC")
	else
		iLen = format(sBuffer, MAX_BUFFER_LENGTH, "%L:^n", id, "VICTIMS")
 
	for (iVictim = 1; iVictim <= iMaxPlayer; iVictim++)
	{
		if (get_user_vstats(id, iVictim, izStats, izBody, t_sWpn, MAX_WEAPON_LENGTH))
		{
			iFound = 1
			get_user_name(iVictim, t_sName, MAX_NAME_LENGTH)
 
			if (izStats[STATS_DEATHS])
			{
				if (!ShowDistHS)
					iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "%s -- %d %L / %d %L / %s^n", t_sName, izStats[STATS_HITS], id, "HIT_S", 
									izStats[STATS_DAMAGE], id, "DMG", t_sWpn)
				else if (izStats[STATS_HS])
					iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "%s -- %d %L / %d %L / %s / %0.0f m / MM_HS^n", t_sName, izStats[STATS_HITS], id, "HIT_S", 
									izStats[STATS_DAMAGE], id, "DMG", t_sWpn, distance(g_izUserVictimDistance[id][iVictim]))
				else
					iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "%s -- %d %L / %d %L / %s / %0.0f m^n", t_sName, izStats[STATS_HITS], id, "HIT_S", 
									izStats[STATS_DAMAGE], id, "DMG", t_sWpn, distance(g_izUserVictimDistance[id][iVictim]))
			}
			else
				iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "%s -- %d %L / %d %L^n", t_sName, izStats[STATS_HITS], id, "HIT_S", izStats[STATS_DAMAGE], id, "DMG")
		}
	}
 
	if (!iFound)
		sBuffer[0] = 0
 
	return iFound
}
 
// Get and format kill info.
get_kill_info(id, iKiller, sBuffer[MAX_BUFFER_LENGTH + 1])
{
	new iFound, iLen
 
	iFound = 0
	sBuffer[0] = 0
 
	if (iKiller && iKiller != id)
	{
		new izAStats[8], izABody[8], izVStats[8], iaVBody[8]
 
		iFound = 1
		get_user_name(iKiller, t_sName, MAX_NAME_LENGTH)
 
		izAStats[STATS_HITS] = 0
		izAStats[STATS_DAMAGE] = 0
		t_sWpn[0] = 0
		get_user_astats(id, iKiller, izAStats, izABody, t_sWpn, MAX_WEAPON_LENGTH)
 
		izVStats[STATS_HITS] = 0
		izVStats[STATS_DAMAGE] = 0
		get_user_vstats(id, iKiller, izVStats, iaVBody)
 
		iLen = format(sBuffer, MAX_BUFFER_LENGTH, "%L^n", id, "KILLED_YOU_DIST", t_sName, t_sWpn, distance(g_izUserAttackerDistance[id]))
		iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "%L^n", id, "DID_DMG_HITS", izAStats[STATS_DAMAGE], izAStats[STATS_HITS], g_izKilled[id][KILLED_KILLER_HEALTH], g_izKilled[id][KILLED_KILLER_ARMOUR])
		iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "%L^n", id, "YOU_DID_DMG", izVStats[STATS_DAMAGE], izVStats[STATS_HITS])
	}
 
	return iFound
}
 
// Get and format most disruptive.
add_most_disruptive(sBuffer[MAX_BUFFER_LENGTH + 1])
{
	new id, iMaxDamageId, iMaxDamage, iMaxHeadShots
 
	iMaxDamageId = 0
	iMaxDamage = 0
	iMaxHeadShots = 0
 
	// Find player.
	for (id = 1; id < MAX_PLAYERS; id++)
	{
		if (g_izUserRndStats[id][STATS_DAMAGE] >= iMaxDamage && (g_izUserRndStats[id][STATS_DAMAGE] > iMaxDamage || g_izUserRndStats[id][STATS_HS] > iMaxHeadShots))
		{
			iMaxDamageId = id
			iMaxDamage = g_izUserRndStats[id][STATS_DAMAGE]
			iMaxHeadShots = g_izUserRndStats[id][STATS_HS]
		}
	}
 
	// Format statistics.
	if (iMaxDamageId)
	{
		id = iMaxDamageId
 
		new Float:fGameEff = effec(g_izUserGameStats[id])
		new Float:fRndAcc = accuracy(g_izUserRndStats[id])
 
		format(t_sText, MAX_TEXT_LENGTH, "%L: %s^n%d %L / %d %L -- %0.2f%% %L / %0.2f%% %L^n", LANG_SERVER, "MOST_DMG", g_izUserRndName[id], 
				g_izUserRndStats[id][STATS_HITS], LANG_SERVER, "HIT_S", iMaxDamage, LANG_SERVER, "DMG", fGameEff, LANG_SERVER, "EFF", fRndAcc, LANG_SERVER, "ACC")
		add(sBuffer, MAX_BUFFER_LENGTH, t_sText)
	}
 
	return iMaxDamageId
}
 
// Get and format best score.
add_best_score(sBuffer[MAX_BUFFER_LENGTH + 1])
{
	new id, iMaxKillsId, iMaxKills, iMaxHeadShots
 
	iMaxKillsId = 0
	iMaxKills = 0
	iMaxHeadShots = 0
 
	// Find player
	for (id = 1; id < MAX_PLAYERS; id++)
	{
		if (g_izUserRndStats[id][STATS_KILLS] >= iMaxKills && (g_izUserRndStats[id][STATS_KILLS] > iMaxKills || g_izUserRndStats[id][STATS_HS] > iMaxHeadShots))
		{
			iMaxKillsId = id
			iMaxKills = g_izUserRndStats[id][STATS_KILLS]
			iMaxHeadShots = g_izUserRndStats[id][STATS_HS]
		}
	}
 
	// Format statistics.
	if (iMaxKillsId)
	{
		id = iMaxKillsId
 
		new Float:fGameEff = effec(g_izUserGameStats[id])
		new Float:fRndAcc = accuracy(g_izUserRndStats[id])
 
		format(t_sText, MAX_TEXT_LENGTH, "%L: %s^n%d %L / %d hs -- %0.2f%% %L / %0.2f%% %L^n", LANG_SERVER, "BEST_SCORE", g_izUserRndName[id], 
				iMaxKills, LANG_SERVER, "KILL_S", iMaxHeadShots, fGameEff, LANG_SERVER, "EFF", fRndAcc, LANG_SERVER, "ACC")
		add(sBuffer, MAX_BUFFER_LENGTH, t_sText)
	}
 
	return iMaxKillsId
}
 
// Get and format team score.
add_team_score(sBuffer[MAX_BUFFER_LENGTH + 1])
{
	new Float:fzMapEff[MAX_TEAMS], Float:fzMapAcc[MAX_TEAMS], Float:fzRndAcc[MAX_TEAMS]
 
	// Calculate team stats
	for (new iTeam = 0; iTeam < MAX_TEAMS; iTeam++)
	{
		fzMapEff[iTeam] = effec(g_izTeamGameStats[iTeam])
		fzMapAcc[iTeam] = accuracy(g_izTeamGameStats[iTeam])
		fzRndAcc[iTeam] = accuracy(g_izTeamRndStats[iTeam])
	}
 
	// Format round team stats, MOTD
	format(t_sText, MAX_TEXT_LENGTH, "TERRORIST %d / %0.2f%% %L / %0.2f%% %L^nCT %d / %0.2f%% %L / %0.2f%% %L^n", g_izTeamScore[0], 
			fzMapEff[0], LANG_SERVER, "EFF", fzRndAcc[0], LANG_SERVER, "ACC", g_izTeamScore[1], fzMapEff[1], LANG_SERVER, "EFF", fzRndAcc[1], LANG_SERVER, "ACC")
	add(sBuffer, MAX_BUFFER_LENGTH, t_sText)
}
 
// Get and format team stats, chat version
save_team_chatscore()
{
	new Float:fzMapEff[MAX_TEAMS], Float:fzMapAcc[MAX_TEAMS], Float:fzRndAcc[MAX_TEAMS]
 
	// Calculate team stats
	for (new iTeam = 0; iTeam < MAX_TEAMS; iTeam++)
	{
		fzMapEff[iTeam] = effec(g_izTeamGameStats[iTeam])
		fzMapAcc[iTeam] = accuracy(g_izTeamGameStats[iTeam])
		fzRndAcc[iTeam] = accuracy(g_izTeamRndStats[iTeam])
	}
 
	// Format game team stats, chat
	format(g_sScore, MAX_BUFFER_LENGTH, "%L $t%d $g/ $t%0.2f%%$g %L / $t%0.2f%% $g%L  --  %L $t%d $g/ $t%0.2f%% $g%L / $t%0.2f%% $g%L", LANG_SERVER, "MM_T", g_izTeamScore[0], 
			fzMapEff[0], LANG_SERVER, "EFF", fzMapAcc[0], LANG_SERVER, "ACC", LANG_SERVER, "MM_CT", g_izTeamScore[1], fzMapEff[1], LANG_SERVER, "EFF", fzMapAcc[1], LANG_SERVER, "ACC")
}
 
// Get and format total stats.
add_total_stats(sBuffer[MAX_BUFFER_LENGTH + 1])
{
	format(t_sText, MAX_TEXT_LENGTH, "%L: %d %L / %d hs -- %d %L / %d %L^n", LANG_SERVER, "TOTAL", g_izUserRndStats[0][STATS_KILLS], LANG_SERVER, "KILL_S", 
			g_izUserRndStats[0][STATS_HS], g_izUserRndStats[0][STATS_HITS], LANG_SERVER, "HITS", g_izUserRndStats[0][STATS_SHOTS], LANG_SERVER, "SHOT_S")
	add(sBuffer, MAX_BUFFER_LENGTH, t_sText)
}
 
// Get and format a user's list of body hits from an attacker.
add_attacker_hits(id, iAttacker, sBuffer[MAX_BUFFER_LENGTH + 1])
{
	new iFound = 0
 
	if (iAttacker && iAttacker != id)
	{
		new izStats[8], izBody[8], iLen
 
		izStats[STATS_HITS] = 0
		get_user_astats(id, iAttacker, izStats, izBody)
 
		if (izStats[STATS_HITS])
		{
			iFound = 1
			iLen = strlen(sBuffer)
			get_user_name(iAttacker, t_sName, MAX_NAME_LENGTH)
 
			iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "%L:^n", id, "HITS_YOU_IN", t_sName)
 
			for (new i = 1; i < 8; i++)
			{
				if (!izBody[i])
					continue
 
				iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "%L: %d^n", id, MM_BODY_PART[i], izBody[i])
			}
		}
	}
 
	return iFound
}
 
// Get and format killed stats: killer hp, ap, hits.
format_kill_ainfo(id, iKiller, sBuffer[MAX_BUFFER_LENGTH + 1])
{
	new iFound = 0
 
	if (iKiller && iKiller != id)
	{
		new izStats[8], izBody[8]
		new iLen
 
		iFound = 1
		get_user_name(iKiller, t_sName, MAX_NAME_LENGTH)
		izStats[STATS_HITS] = 0
		get_user_astats(id, iKiller, izStats, izBody, t_sWpn, MAX_WEAPON_LENGTH)
 
		iLen = format(sBuffer, MAX_BUFFER_LENGTH, "%L (%d%L, %d%L) $g>>", id, "KILLED_BY_WITH", t_sName, t_sWpn, distance(g_izUserAttackerDistance[id]), 
						g_izKilled[id][KILLED_KILLER_HEALTH], id, "MM_HP",  g_izKilled[id][KILLED_KILLER_ARMOUR], id, "MM_AP")
 
		if (izStats[STATS_HITS])
		{
			for (new i = 1; i < 8; i++)
			{
				if (!izBody[i])
					continue
 
				iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, " $g%L: $t%d$g", id, MM_BODY_PART[i], izBody[i])
			}
		}
		else
			iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, " %L", id, "NO_HITS")
	}
	else
		format(sBuffer, MAX_BUFFER_LENGTH, "%L", id, "YOU_NO_KILLER")
 
	return iFound
}
 
// Get and format killed stats: hits, damage on killer.
format_kill_vinfo(id, iKiller, sBuffer[MAX_BUFFER_LENGTH + 1])
{
	new iFound = 0
	new izStats[8]
	new izBody[8]
	new iLen
 
	izStats[STATS_HITS] = 0
	izStats[STATS_DAMAGE] = 0
	get_user_vstats(id, iKiller, izStats, izBody)
 
	if (iKiller && iKiller != id)
	{
		iFound = 1
		get_user_name(iKiller, t_sName, MAX_NAME_LENGTH)
		iLen = format(sBuffer, MAX_BUFFER_LENGTH, "%L $g>>", id, "YOU_HIT", t_sName, izStats[STATS_HITS], izStats[STATS_DAMAGE])
	}
	else
		iLen = format(sBuffer, MAX_BUFFER_LENGTH, "%L $g>>", id, "LAST_RES", izStats[STATS_HITS], izStats[STATS_DAMAGE])
 
	if (izStats[STATS_HITS])
	{
		for (new i = 1; i < 8; i++)
		{
			if (!izBody[i])
				continue
 
			iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, " $g%L: $t%d$g", id, MM_BODY_PART[i], izBody[i])
		}
	}
	else
		iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, " %L", id, "NO_HITS")
 
	return iFound
}
 
// MastaMan Edition
format_topx(sBuffer[MAX_BUFFER_LENGTH + 1])
{
	new izStats[8], izBody[8]
	new iLen = 0
 
	new lKills[30], lDeaths[30], lHits[30], lShots[30], lEff[30], lAcc[30], lHs[30], lNick[30], lPot[45]
 
 
	format(lNick, 29, "%L", LANG_SERVER, "MM_NICK")
	replace_all(lNick, 29, " ", "&nbsp")
	format(lKills, 29, "%L", LANG_SERVER, "KILLS")
	format(lDeaths, 29, "%L", LANG_SERVER, "DEATHS")
	format(lHits, 29, "%L", LANG_SERVER, "HITS")
	format(lShots, 29, "%L", LANG_SERVER, "SHOTS")
	format(lHs, 29, "%L", LANG_SERVER, "MM_HS")
	replace_all(lHs, 29, " ", "&nbsp")
	format(lEff, 29, "%L", LANG_SERVER, "MM_EFF")
	format(lAcc, 29, "%L", LANG_SERVER, "MM_ACC")
	format(lPot, 44, "%L", LANG_SERVER, "MM_POT")
 
	ucfirst(lEff)
	ucfirst(lAcc)
 
 
	iLen = format_all_themes(sBuffer, iLen)
 
 
	iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<body><table width=100%% border=0 align=center cellpadding=0 cellspacing=1>")	
 
	if(get_pcvar_num(pcvar_style))
	{
		iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<body><tr><th>%s<th>%s<th>%s<th>%s<th>%s<th>%s</tr>", "#", lNick, lKills, lDeaths, lHs, lPot)
	}
	else
	{
		iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<body><tr><th>%s<th>%s<th>%s<th>%s<th>%s</tr>", "#", lNick, lKills, lDeaths, lHs)
	}
 
	for (new i = iTopX; i < iTopEnd && MAX_BUFFER_LENGTH - iLen > 0; i++)
	{
		iLen = format_all_stats(g_sBuffer, izStats, izBody, iLen, i)
	}
}
 
// MastaMan Edition
format_place1(sBuffer[MAX_BUFFER_LENGTH + 1])
{
	new iMax = get_statsnum()
	new izStats[8], izBody[8]
	new iLen = 0
 
	if(get_pcvar_num(pcvar_style))
	{
		if (iMax > 10)
			iMax = 10
	}
	else
	{
		if (iMax > 15)
			iMax = 15
	}
 
	new lFirstPlace[60], lKills[30], lDeaths[30], lHits[30], lShots[30], lEff[30], lAcc[30], lHs[30], lNick[30], lPot[45]
 
 
	format(lFirstPlace, 59, "%L", LANG_SERVER, "MM_FIRSTPLACE")
	format(lNick, 29, "%L", LANG_SERVER, "MM_NICK")
	replace_all(lNick, 29, " ", "&nbsp")
	format(lKills, 29, "%L", LANG_SERVER, "KILLS")
	format(lDeaths, 29, "%L", LANG_SERVER, "DEATHS")
	format(lHits, 29, "%L", LANG_SERVER, "HITS")
	format(lShots, 29, "%L", LANG_SERVER, "SHOTS")
	format(lHs, 29, "%L", LANG_SERVER, "MM_HS")
	replace_all(lHs, 29, " ", "&nbsp")
	format(lEff, 29, "%L", LANG_SERVER, "MM_EFF")
	format(lAcc, 29, "%L", LANG_SERVER, "MM_ACC")
	format(lPot, 44, "%L", LANG_SERVER, "MM_POT")
 
	ucfirst(lEff)
	ucfirst(lAcc)
 
	iLen = format_all_themes(sBuffer, iLen)
 
	if(get_pcvar_num(pcvar_style))
	{
		iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<body><h2>%s</h2> <table width=100%% border=0 align=center cellpadding=0 cellspacing=1>", lFirstPlace)
		iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<body><tr><th>%s<th>%s<th>%s<th>%s<th>%s<th>%s</tr>", "#", lNick, lKills, lDeaths, lHs, lPot)
	}
	else
	{
		iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<body><table width=100%% border=0 align=center cellpadding=0 cellspacing=1>")
		iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<body><tr><th>%s<th>%s<th>%s<th>%s<th>%s</tr>", "#", lNick, lKills, lDeaths, lHs)
	}
 
 
	for (new i = 0; i < iMax && MAX_BUFFER_LENGTH - iLen > 0; i++)
	{
		iLen = format_all_stats(g_sBuffer, izStats, izBody, iLen, i)
	}
}
 
format_all_themes(sBuffer[MAX_BUFFER_LENGTH + 1], iLen)
{
	if(get_pcvar_num(pcvar_design)<= STATSX_SHELL_DESIGN_MAX)
	{
		iDesign = get_pcvar_num(pcvar_design)
	}
	else
	{
		if(get_pcvar_num(pcvar_design) == (STATSX_SHELL_DESIGN_MAX + 1))
		{
			iDesign = random_num(1,STATSX_SHELL_DESIGN_MAX)
		}
	}
 
	switch(iDesign)
	{
		case 1:
		{
			iLen = format(sBuffer, MAX_BUFFER_LENGTH, STATSX_SHELL_DESIGN1_STYLE)
		}
 
		case 2:
		{
			iLen = format(sBuffer, MAX_BUFFER_LENGTH, STATSX_SHELL_DESIGN2_STYLE)
		}
 
		case 3:
		{
			iLen = format(sBuffer, MAX_BUFFER_LENGTH, STATSX_SHELL_DESIGN3_STYLE)
		}
 
		case 4:
		{
			iLen = format(sBuffer, MAX_BUFFER_LENGTH, STATSX_SHELL_DESIGN4_STYLE)
		}
 
		case 5:
		{
			iLen = format(sBuffer, MAX_BUFFER_LENGTH, STATSX_SHELL_DESIGN5_STYLE)
		}
 
		case 6:
		{
			iLen = format(sBuffer, MAX_BUFFER_LENGTH, STATSX_SHELL_DESIGN6_STYLE)
		}
 
		case 7:
		{
			iLen = format(sBuffer, MAX_BUFFER_LENGTH, STATSX_SHELL_DESIGN7_STYLE)
		}
 
		case 8:
		{
			iLen = format(sBuffer, MAX_BUFFER_LENGTH, STATSX_SHELL_DESIGN8_STYLE)
		}
 
		case 9:
		{
			iLen = format(sBuffer, MAX_BUFFER_LENGTH, STATSX_SHELL_DESIGN9_STYLE)
		}
 
		case 10:
		{
			iLen = format(sBuffer, MAX_BUFFER_LENGTH, STATSX_SHELL_DESIGN10_STYLE)
		}
 
		case 11:
		{
			iLen = format(sBuffer, MAX_BUFFER_LENGTH, STATSX_SHELL_DESIGN11_STYLE)
		}
 
		case 12:
		{
			iLen = format(sBuffer, MAX_BUFFER_LENGTH, STATSX_SHELL_DESIGN12_STYLE)
		}
 
		case 13:
		{
			iLen = format(sBuffer, MAX_BUFFER_LENGTH, STATSX_SHELL_DESIGN13_STYLE)
		}
 
		default:
		{
			iLen = format(sBuffer, MAX_BUFFER_LENGTH, STATSX_SHELL_DEFAULT_STYLE)			
		}
	}
 
	return iLen
}
 
format_all_stats(sBuffer[MAX_BUFFER_LENGTH + 1], izStats[8], izBody[8], iLen, i)
{
	get_stats(i, izStats, izBody, t_sName, MAX_NAME_LENGTH)
	replace_all(t_sName, MAX_NAME_LENGTH, "<", "&lt")
	replace_all(t_sName, MAX_NAME_LENGTH, ">", "&gt")
 
	if (szTrigger)
	{
		szTrigger = false
 
		if(get_pcvar_num(pcvar_style))
		{
			iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<tr><td>%d<td>%s<td>%d<td>%d<td>%d", i + 1, t_sName, izStats[STATS_KILLS], 
				izStats[STATS_DEATHS], izStats[STATS_HS])
 
			if(((effec(izStats) + accuracy(izStats)) / 2) < 50)
			{
				iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<td><img id=r width=%3.0f%%>%2.0f%%</tr>", (((effec(izStats) + accuracy(izStats)) / 2) / 1.3), ((effec(izStats) + accuracy(izStats)) / 2))
			}
			else
			{
					iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<td><img width=%3.0f%%>%2.0f%%</tr>", (((effec(izStats) + accuracy(izStats)) / 2) / 1.3), ((effec(izStats) + accuracy(izStats)) / 2))
			}
		}
		else
		{
			iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<tr><td>%d<td>%s<td>%d<td>%d<td>%d</tr>", i + 1, t_sName, izStats[STATS_KILLS], 
				izStats[STATS_DEATHS], izStats[STATS_HS])
 
		}
	}
	else
	{
		szTrigger = true
 
		if(get_pcvar_num(pcvar_style))
		{
			iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<tr id=c><td>%d<td>%s<td>%d<td>%d<td>%d", i + 1, t_sName, izStats[STATS_KILLS], 
					izStats[STATS_DEATHS], izStats[STATS_HS])
 
			if(((effec(izStats) + accuracy(izStats)) / 2) < 50)
			{
 
				iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<td><img id=r width=%3.0f%%>%2.0f%%</tr>", (((effec(izStats) + accuracy(izStats)) / 2) / 1.3), ((effec(izStats) + accuracy(izStats)) / 2))
			}
			else
			{
				iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<td><img width=%3.0f%%>%2.0f%%</tr>", (((effec(izStats) + accuracy(izStats)) / 2) / 1.3), ((effec(izStats) + accuracy(izStats)) / 2))
			}
		}
		else
		{
			iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<tr id=c><td>%d<td>%s<td>%d<td>%d<td>%d</tr>", i + 1, t_sName, izStats[STATS_KILLS], 
				izStats[STATS_DEATHS], izStats[STATS_HS])
		}
	}
 
	return iLen
}
 
format_dmg_stats(sBuffer[MAX_BUFFER_LENGTH + 1], izStats[8], iLen, i)
{
	if (szTrigger)
	{
		szTrigger = false
 
		iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<tr><td>%d<td>%s<td>%d<td>%d<td>%d</tr>", i + 1, t_sName, izStats[STATS_DAMAGE], izStats[STATS_KILLS], 
			izStats[STATS_DEATHS])
 
		if(((effec(izStats) + accuracy(izStats)) / 2) < 50)
		{
			iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<td><img id=r width=%3.0f%%>%2.0f%%</tr>", (((effec(izStats) + accuracy(izStats)) / 2) / 1.3), ((effec(izStats) + accuracy(izStats)) / 2))
		}
		else
		{
				iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "<td><img width=%3.0f%%>%2.0f%%</tr>", (((effec(izStats) 
			

Dodanych wklejek: 4031
Powered By (Pav32) Pastebin © 2011