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.
1622.
1623.
1624.
1625.
1626.
1627.
1628.
1629.
1630.
1631.
1632.
1633.
1634.
1635.
1636.
1637.
1638.
1639.
1640.
1641.
1642.
1643.
1644.
1645.
1646.
1647.
1648.
1649.
1650.
1651.
1652.
1653.
1654.
1655.
1656.
1657.
1658.
1659.
1660.
1661.
1662.
1663.
1664.
1665.
1666.
1667.
1668.
1669.
1670.
1671.
1672.
1673.
1674.
1675.
1676.
1677.
1678.
1679.
1680.
1681.
1682.
1683.
1684.
1685.
1686.
1687.
1688.
1689.
1690.
1691.
1692.
1693.
1694.
1695.
1696.
1697.
1698.
1699.
1700.
1701.
1702.
1703.
1704.
1705.
1706.
1707.
1708.
1709.
1710.
1711.
1712.
1713.
1714.
1715.
1716.
1717.
1718.
1719.
1720.
1721.
1722.
1723.
1724.
1725.
1726.
1727.
1728.
1729.
1730.
1731.
1732.
1733.
1734.
1735.
1736.
1737.
1738.
1739.
1740.
1741.
1742.
1743.
1744.
1745.
1746.
1747.
1748.
1749.
1750.
1751.
1752.
1753.
1754.
1755.
1756.
1757.
1758.
1759.
1760.
1761.
1762.
1763.
1764.
1765.
1766.
1767.
1768.
1769.
1770.
1771.
1772.
1773.
1774.
1775.
1776.
1777.
1778.
1779.
1780.
1781.
1782.
1783.
1784.
1785.
1786.
1787.
1788.
1789.
1790.
1791.
1792.
1793.
1794.
1795.
1796.
1797.
1798.
1799.
1800.
1801.
1802.
1803.
1804.
1805.
1806.
1807.
1808.
1809.
1810.
1811.
1812.
1813.
1814.
1815.
1816.
1817.
1818.
1819.
1820.
1821.
1822.
1823.
1824.
1825.
1826.
1827.
1828.
1829.
1830.
1831.
1832.
1833.
1834.
1835.
1836.
1837.
1838.
1839.
1840.
1841.
1842.
1843.
1844.
1845.
1846.
1847.
1848.
1849.
1850.
1851.
1852.
1853.
1854.
1855.
1856.
1857.
1858.
1859.
1860.
1861.
1862.
1863.
1864.
1865.
1866.
1867.
1868.
1869.
1870.
1871.
1872.
1873.
1874.
1875.
1876.
1877.
1878.
1879.
1880.
1881.
1882.
1883.
1884.
1885.
1886.
1887.
1888.
1889.
1890.
1891.
1892.
1893.
1894.
1895.
1896.
1897.
1898.
1899.
1900.
1901.
1902.
1903.
1904.
1905.
1906.
1907.
1908.
1909.
1910.
1911.
1912.
1913.
1914.
1915.
1916.
1917.
1918.
1919.
1920.
1921.
1922.
1923.
1924.
1925.
1926.
1927.
1928.
1929.
1930.
1931.
1932.
1933.
1934.
1935.
1936.
1937.
1938.
1939.
1940.
1941.
1942.
1943.
1944.
1945.
1946.
1947.
1948.
1949.
1950.
1951.
1952.
1953.
1954.
1955.
1956.
1957.
1958.
1959.
1960.
1961.
1962.
1963.
1964.
1965.
1966.
1967.
1968.
1969.
1970.
1971.
1972.
1973.
1974.
1975.
1976.
1977.
1978.
1979.
1980.
1981.
1982.
1983.
1984.
1985.
1986.
1987.
1988.
1989.
1990.
1991.
1992.
1993.
1994.
1995.
1996.
1997.
1998.
1999.
2000.
2001.
2002.
2003.
2004.
2005.
2006.
2007.
2008.
2009.
2010.
2011.
2012.
2013.
2014.
2015.
2016.
2017.
2018.
2019.
2020.
2021.
2022.
2023.
2024.
2025.
2026.
2027.
2028.
2029.
2030.
2031.
2032.
2033.
2034.
2035.
2036.
2037.
2038.
2039.
2040.
2041.
2042.
2043.
2044.
2045.
2046.
2047.
2048.
2049.
2050.
2051.
2052.
2053.
2054.
2055.
2056.
2057.
2058.
2059.
2060.
2061.
2062.
2063.
2064.
2065.
2066.
2067.
2068.
2069.
2070.
2071.
2072.
2073.
2074.
2075.
2076.
2077.
2078.
2079.
2080.
2081.
2082.
2083.
2084.
2085.
2086.
2087.
2088.
2089.
2090.
2091.
2092.
2093.
2094.
2095.
2096.
2097.
2098.
2099.
2100.
2101.
2102.
2103.
2104.
2105.
2106.
2107.
2108.
2109.
2110.
2111.
2112.
2113.
2114.
2115.
2116.
2117.
2118.
2119.
2120.
2121.
2122.
2123.
2124.
2125.
2126.
2127.
2128.
2129.
2130.
2131.
2132.
2133.
2134.
2135.
2136.
2137.
2138.
2139.
2140.
2141.
2142.
2143.
2144.
2145.
2146.
2147.
2148.
2149.
2150.
2151.
2152.
2153.
2154.
2155.
2156.
2157.
2158.
2159.
2160.
2161.
2162.
2163.
2164.
2165.
2166.
2167.
2168.
2169.
2170.
2171.
2172.
2173.
2174.
2175.
2176.
2177.
2178.
2179.
2180.
2181.
2182.
2183.
2184.
2185.
2186.
2187.
2188.
2189.
2190.
2191.
2192.
2193.
2194.
2195.
2196.
2197.
2198.
2199.
2200.
2201.
2202.
2203.
2204.
2205.
2206.
2207.
2208.
2209.
2210.
2211.
2212.
2213.
2214.
2215.
2216.
2217.
2218.
2219.
2220.
2221.
2222.
2223.
2224.
2225.
2226.
2227.
2228.
2229.
2230.
2231.
2232.
2233.
2234.
2235.
2236.
2237.
2238.
2239.
2240.
2241.
2242.
2243.
2244.
2245.
2246.
2247.
2248.
2249.
2250.
2251.
2252.
2253.
2254.
2255.
2256.
2257.
2258.
2259.
2260.
2261.
2262.
2263.
2264.
2265.
2266.
2267.
2268.
2269.
2270.
2271.
2272.
2273.
2274.
2275.
2276.
2277.
2278.
2279.
2280.
2281.
2282.
2283.
2284.
2285.
2286.
2287.
2288.
2289.
2290.
2291.
2292.
2293.
2294.
2295.
2296.
2297.
2298.
2299.
2300.
2301.
2302.
2303.
2304.
2305.
2306.
2307.
2308.
2309.
2310.
2311.
2312.
2313.
2314.
2315.
2316.
2317.
2318.
2319.
2320.
2321.
2322.
2323.
2324.
2325.
2326.
2327.
2328.
2329.
2330.
2331.
2332.
2333.
2334.
2335.
2336.
2337.
2338.
2339.
2340.
2341.
2342.
2343.
2344.
2345.
2346.
2347.
2348.
2349.
2350.
2351.
2352.
2353.
2354.
2355.
2356.
2357.
2358.
2359.
2360.
2361.
2362.
2363.
2364.
2365.
2366.
2367.
2368.
2369.
2370.
2371.
2372.
2373.
2374.
2375.
2376.
2377.
2378.
2379.
2380.
2381.
2382.
2383.
2384.
2385.
2386.
2387.
2388.
2389.
2390.
2391.
2392.
2393.
2394.
2395.
2396.
2397.
2398.
2399.
2400.
2401.
2402.
2403.
2404.
2405.
2406.
2407.
2408.
2409.
2410.
2411.
2412.
2413.
2414.
2415.
2416.
2417.
2418.
2419.
2420.
2421.
2422.
2423.
2424.
2425.
2426.
2427.
2428.
2429.
2430.
2431.
2432.
2433.
2434.
2435.
2436.
2437.
2438.
2439.
2440.
2441.
2442.
2443.
2444.
2445.
2446.
2447.
2448.
2449.
2450.
2451.
2452.
2453.
2454.
2455.
2456.
2457.
2458.
2459.
2460.
2461.
2462.
2463.
2464.
2465.
2466.
2467.
2468.
2469.
2470.
2471.
2472.
2473.
2474.
2475.
2476.
2477.
2478.
2479.
2480.
2481.
2482.
2483.
2484.
2485.
2486.
2487.
2488.
2489.
2490.
2491.
2492.
2493.
2494.
2495.
2496.
2497.
2498.
2499.
2500.
2501.
2502.
2503.
2504.
2505.
2506.
2507.
2508.
2509.
2510.
2511.
2512.
2513.
2514.
2515.
2516.
2517.
2518.
2519.
2520.
2521.
2522.
2523.
2524.
2525.
2526.
2527.
2528.
2529.
2530.
2531.
2532.
2533.
2534.
2535.
2536.
2537.
2538.
2539.
2540.
2541.
2542.
2543.
2544.
2545.
2546.
2547.
2548.
2549.
2550.
2551.
2552.
2553.
2554.
2555.
2556.
2557.
2558.
2559.
2560.
2561.
2562.
2563.
2564.
2565.
2566.
2567.
2568.
2569.
2570.
2571.
2572.
2573.
2574.
2575.
2576.
2577.
2578.
2579.
2580.
2581.
2582.
2583.
2584.
2585.
2586.
2587.
2588.
2589.
2590.
2591.
2592.
2593.
2594.
2595.
2596.
2597.
2598.
2599.
2600.
2601.
2602.
2603.
2604.
2605.
2606.
2607.
2608.
2609.
2610.
2611.
2612.
2613.
2614.
2615.
2616.
2617.
2618.
2619.
2620.
2621.
2622.
2623.
2624.
2625.
2626.
2627.
2628.
2629.
2630.
2631.
2632.
2633.
2634.
2635.
2636.
2637.
2638.
2639.
2640.
2641.
2642.
2643.
2644.
2645.
2646.
2647.
2648.
2649.
2650.
2651.
2652.
2653.
2654.
2655.
2656.
2657.
2658.
2659.
2660.
2661.
2662.
2663.
2664.
2665.
2666.
2667.
2668.
2669.
2670.
2671.
2672.
2673.
2674.
2675.
2676.
2677.
2678.
2679.
2680.
2681.
2682.
2683.
2684.
2685.
2686.
2687.
2688.
2689.
2690.
2691.
2692.
2693.
2694.
2695.
2696.
2697.
2698.
2699.
2700.
2701.
2702.
2703.
2704.
2705.
2706.
2707.
2708.
2709.
2710.
2711.
2712.
2713.
2714.
2715.
2716.
2717.
2718.
2719.
2720.
2721.
2722.
2723.
2724.
2725.
2726.
2727.
2728.
2729.
2730.
2731.
2732.
2733.
2734.
2735.
2736.
2737.
2738.
2739.
2740.
2741.
2742.
2743.
2744.
2745.
2746.
2747.
2748.
2749.
2750.
2751.
2752.
2753.
2754.
2755.
2756.
2757.
2758.
2759.
2760.
2761.
2762.
2763.
2764.
2765.
2766.
2767.
2768.
2769.
2770.
2771.
2772.
2773.
2774.
2775.
2776.
2777.
2778.
2779.
2780.
2781.
2782.
2783.
2784.
2785.
2786.
2787.
2788.
2789.
2790.
2791.
2792.
2793.
2794.
2795.
2796.
2797.
2798.
2799.
2800.
2801.
2802.
2803.
2804.
2805.
2806.
2807.
2808.
2809.
2810.
2811.
2812.
2813.
2814.
2815.
2816.
2817.
2818.
2819.
2820.
2821.
2822.
2823.
2824.
2825.
2826.
2827.
2828.
2829.
2830.
2831.
2832.
2833.
2834.
2835.
2836.
2837.
2838.
2839.
2840.
2841.
2842.
2843.
2844.
2845.
2846.
2847.
2848.
2849.
2850.
2851.
2852.
2853.
2854.
2855.
2856.
2857.
2858.
2859.
2860.
2861.
2862.
2863.
2864.
2865.
2866.
2867.
2868.
2869.
2870.
2871.
2872.
2873.
2874.
2875.
2876.
2877.
2878.
2879.
2880.
2881.
2882.
2883.
2884.
2885.
2886.
2887.
2888.
2889.
2890.
2891.
2892.
2893.
2894.
2895.
2896.
2897.
2898.
2899.
2900.
2901.
2902.
2903.
2904.
2905.
2906.
2907.
2908.
2909.
2910.
2911.
2912.
2913.
2914.
2915.
2916.
2917.
2918.
2919.
2920.
2921.
2922.
2923.
2924.
2925.
2926.
2927.
2928.
2929.
2930.
2931.
2932.
2933.
2934.
2935.
2936.
2937.
2938.
2939.
2940.
2941.
2942.
2943.
2944.
2945.
2946.
2947.
2948.
2949.
2950.
2951.
2952.
2953.
2954.
2955.
2956.
2957.
2958.
2959.
2960.
2961.
2962.
2963.
2964.
2965.
2966.
2967.
2968.
2969.
2970.
2971.
2972.
2973.
2974.
2975.
2976.
2977.
2978.
2979.
2980.
2981.
2982.
2983. | // This is a modified version of OneEyed Soccer Jam plugin.
// You may want to get the original:
// http://forums.alliedmods.net/showthread.php?t=41447
#pragma dynamic 131072 //I used to much memory =(
/*
* CVARs:
* - These CVARS can be changed at any time during round!
* sj_kick (default: 650) - Default Kicking Speed.
* sj_score (default: 15) - Scores needed to win a round.
* sj_reset (default: 30.0) - Ball reset time, to respawn at ball spawn location.
* sj_goalsafety (default: 650) - Distance around Mascot, that does damage to enemy.
* sj_random (default: 1) - Turns Team Randomizing ON/OFF.
*
* Requires: AMXX 1.75+
*
* Author: OneEyed
* IRC: #soccerjam (irc.gamesurge.net)
* Website: http://www.soccer-jam.com/
*/
/* ------------------------------------------------------------------------- */
/* /----------------------- START OF CUSTOMIZATION -----------------------/ */
/* ------------------------------------------------------------------------- */
/* ------------------------------------------------------------------------- */
/* ------------------------------------------------------------------------- */
/* /------------ CUSTOM DEFINES ------------ CUSTOM DEFINES ------------/ */
/* ------------------------------------------------------------------------- */
// Disable knife disarm ? (Leaves only ball disarm)
// Comment this define to disable.
#define KNIFE_DISARM_ON
//When player reaches MAX level, they receive this many levels.
#define MAX_LVL_BONUS 1
//Max levels for each upgrade
#define MAX_LVL_STAMINA 7
#define MAX_LVL_STRENGTH 12
#define MAX_LVL_AGILITY 7
#define MAX_LVL_DEXTERITY 10
#define MAX_LVL_DISARM 10
#define MAX_LVL_POWERPLAY 10
//Prices for each upgrade.
//price = ((UpgradeLevel * UpgradePrice) / 2) + UpgradePrice
#define EXP_PRICE_STAMINA 250
#define EXP_PRICE_STRENGTH 120
#define EXP_PRICE_AGILITY 350
#define EXP_PRICE_DEXTERITY 100
#define EXP_PRICE_DISARM 100
//Experience per stat.
#define EXP_GOALY 450 //for goaly save and goaly points.
#define EXP_STEAL 700
#define EXP_KILL 400
#define EXP_ASSIST 1000
#define EXP_GOAL 700
#define BASE_HP 100 //starting hp
#define BASE_SPEED 250.0 //starting run speed
#define BASE_DISARM 10 //starting disarm from lvl 1
#define COUNTDOWN_TIME 10 //Countdown time between rounds.
#define GOALY_DELAY 8.0 //Delay for goaly exp
//Curve Ball Defines
#define CURVE_ANGLE 5 //Angle for spin kick multipled by current direction.
#define CURVE_COUNT 6 //Curve this many times.
#define CURVE_TIME 0.07 //Time to curve again.
#define DIRECTIONS 5 //# of angles allowed.
#define ANGLEDIVIDE 6 //Divide angle this many times for curve.
//Misc. amounts
#define AMOUNT_LATEJOINEXP 325 //latejoinexp * each scored point.
#define AMOUNT_POWERPLAY 8 //added bonus to STR and AGI per powerplay lvl.
#define AMOUNT_GOALY 10 //Goaly camper exp
//Amount of points for each upgrade.
#define AMOUNT_STA 20 //Health per lvl
#define AMOUNT_STR 23 //Stronger kicking per lvl
#define AMOUNT_AGI 13 //Faster Speed per lvl
#define AMOUNT_DEX 10 //Better Catching
#define AMOUNT_DISARM 3 //Disarm ball chance (disarm lvl * this) if random num 1-100 < disarm
#define DISARM_MULTIPLIER 3
/* ------------------------------------------------------------------------- */
/* /---------------- TEAM NAMES ------------ TEAM NAMES ------------/ */
/* ------------------------------------------------------------------------- */
#define TEAMS 4 //Don't edit this.
//Names to be put on scoreboard.
static const TeamNames[TEAMS][] = {
"BRAK",
"Manchester United", //Manchester United
"Chelsea Londyn", //Chelsea Londyn
"BRAK"
}
/* ------------------------------------------------------------------------- */
/* /---------------- MODELS ---------------- MODELS ----------------/ */
/* ------------------------------------------------------------------------- */
//You may change the ball model. Just give correct path of new model.
new ball[] = "models/kickball/csk_ball.mdl"
static const TeamMascots[2][] = {
"models/kingpin.mdl", //TERRORIST MASCOT
"models/garg.mdl" //CT MASCOT
}
/* ------------------------------------------------------------------------- */
/* /---------------- COLORS ---------------- COLORS ----------------/ */
/* ------------------------------------------------------------------------- */
//Format is RGB 0-255
//TEAM MODEL GLOW COLORS
#define TERR_GLOW_RED 250
#define TERR_GLOW_GREEN 10
#define TERR_GLOW_BLUE 10
#define CT_GLOW_RED 10
#define CT_GLOW_GREEN 10
#define CT_GLOW_BLUE 250
//TEAM HUD METER COLOR (Turbo/Curve Angle meters)
#define TERR_METER_RED 250
#define TERR_METER_GREEN 10
#define TERR_METER_BLUE 10
#define CT_METER_RED 10
#define CT_METER_GREEN 10
#define CT_METER_BLUE 250
//BALL GLOW COLOR (default: yellow) //it glows only one color
#define BALL_RED 255
#define BALL_GREEN 200
#define BALL_BLUE 100
//BALL BEAM
#define BALL_BEAM_WIDTH 5
#define BALL_BEAM_LIFE 10
#define BALL_BEAM_RED 50
#define BALL_BEAM_GREEN 50
#define BALL_BEAM_BLUE 150
#define BALL_BEAM_ALPHA 255
/* ------------------------------------------------------------------------- */
/* /---------------- SOUNDS ---------------- SOUNDS ----------------/ */
/* ------------------------------------------------------------------------- */
//-- NOTE: Sounds must be located in sound/kickball/ folder.
new BALL_BOUNCE_GROUND[] = "kickball/bounce.wav"
new BALL_RESPAWN[] = "kickball/returned.wav"
new BALL_KICKED[] = "kickball/kicked.wav"
new BALL_PICKED_UP[] = "kickball/gotball.wav"
new UPGRADED_MAX_LEVEL[] = "kickball/levelup.wav"
new ROUND_START[] = "kickball/prepare.wav"
new SCORED_GOAL[] = "kickball/distress.wav"
new STOLE_BALL_FAST[] = "kickball/pussy.wav"
//When a goal is scored, one of these will randomly play.
#define MAX_SOUNDS 6
new SCORED_SOUNDS[MAX_SOUNDS][] = {
"kickball/amaze.wav",
"kickball/laugh.wav",
"kickball/perfect.wav",
"kickball/diebitch.wav",
"kickball/bday.wav",
"kickball/boomchakalaka.wav"
}
/* ------------------------------------------------------------------------- */
/* ------------------------------------------------------------------------- */
/* /------------------------ END OF CUSTOMIZATION ------------------------/ */
/* ------------------------------------------------------------------------- */
/* ------------------------------------------------------------------------- */
/* ------------ DO NOT EDIT BELOW ---------------------------------------------------------- */
/* -------------------------- DO NOT EDIT BELOW -------------------------------------------- */
/* --------------------------------------- DO NOT EDIT BELOW ------------------------------- */
/* ---------------------------------------------------- DO NOT EDIT BELOW ------------------ */
#include <amxmodx>
#include <cstrike>
#include <engine>
#include <fakemeta>
#include <fun>
static const AUTHOR[] = "OneEyed"
static const VERSION[] = "2.07a1"
#define MAX_TEXT_BUFFER 2047
#define MAX_NAME_LENGTH 33
#define MAX_PLAYER 33
#define MAX_ASSISTERS 3
#define MAX_BALL_SPAWNS 5
#define POS_X -1.0
#define POS_Y 0.85
#define HUD_CHANNEL 4
#define MESSAGE_DELAY 4.0
enum {
UNASSIGNED = 0,
T,
CT,
SPECTATOR
}
#define RECORDS 6
enum {
GOAL = 1,
ASSIST,
STEAL,
KILL,
DISTANCE,
GOALY
}
#define UPGRADES 5
enum {
STA = 1, //stamina
STR, //strength
AGI, //agility
DEX, //dexterity
DISARM,
}
static const UpgradeTitles[UPGRADES+1][] = {
"BRAK",
"Zycie",
"Sila Kopniecia",
"Szybkosc",
"Lapanie Pilki",
"Rozbrajanie"
}
new const UpgradeMax[UPGRADES+1] = {
0, //NULL
MAX_LVL_STAMINA, //STAMINA
MAX_LVL_STRENGTH, //STRENGTH
MAX_LVL_AGILITY, //AGILITY
MAX_LVL_DEXTERITY, //DEXTERITY
MAX_LVL_DISARM, //DISARM
}
new const UpgradePrice[UPGRADES+1] = {
0, //NULL
EXP_PRICE_STAMINA,
EXP_PRICE_STRENGTH,
EXP_PRICE_AGILITY,
EXP_PRICE_DEXTERITY,
EXP_PRICE_DISARM,
}
new TeamColors[TEAMS][3] =
{
{ 0, 0, 0 },
{ TERR_GLOW_RED, TERR_GLOW_GREEN, TERR_GLOW_BLUE } ,
{ CT_GLOW_RED, CT_GLOW_GREEN, CT_GLOW_BLUE },
{ 0, 0, 0 }
}
new TeamMeterColors[TEAMS][3] =
{
{ 0, 0, 0 },
{ TERR_METER_RED, TERR_METER_GREEN, TERR_METER_BLUE } ,
{ CT_METER_RED, CT_METER_GREEN, CT_METER_BLUE },
{ 0, 0, 0 }
}
new ballcolor[3] = { BALL_RED, BALL_GREEN, BALL_BLUE }
new PlayerUpgrades[MAX_PLAYER][UPGRADES+1]
new GoalEnt[TEAMS]
new PressedAction[MAX_PLAYER]
new seconds[MAX_PLAYER]
new g_sprint[MAX_PLAYER]
new SideJump[MAX_PLAYER]
new Float:SideJumpDelay[MAX_PLAYER]
new PlayerDeaths[MAX_PLAYER]
new PlayerKills[MAX_PLAYER]
new curvecount
new direction
new maxplayers
new Float:BallSpinDirection[3]
new ballspawncount
new Float:TeamBallOrigins[TEAMS][3]
new Float:TEMP_TeamBallOrigins[3]
new Mascots[TEAMS]
new Float:MascotsOrigins[3]
new Float:MascotsAngles[3]
new menu_upgrade[MAX_PLAYER]
new Float:fire_delay
new winner
new Float:GoalyCheckDelay[MAX_PLAYER]
new GoalyCheck[MAX_PLAYER]
new GoalyPoints[MAX_PLAYER]
new Float:BallSpawnOrigin[MAX_BALL_SPAWNS][3]
new TopPlayer[2][RECORDS+1]
new MadeRecord[MAX_PLAYER][RECORDS+1]
new TopPlayerName[RECORDS+1][MAX_NAME_LENGTH]
new g_Experience[MAX_PLAYER]
new timer
new Float:testorigin[3]
new Float:velocity[3]
new score[TEAMS]
new scoreboard[1025]
new temp1[64], temp2[64]
new distorig[2][3] //distance recorder
new gmsgShake
new gmsgDeathMsg
new gmsgSayText
new gmsgTextMsg
new goaldied[MAX_PLAYER]
new bool:is_dead[MAX_PLAYER]
new terr[33], ct[33], cntCT, cntT
new PowerPlay, powerplay_list[MAX_LVL_POWERPLAY+1]
new assist[16]
new iassist[TEAMS]
new gamePlayerEquip
new CVAR_SCORE
new CVAR_RESET
new CVAR_GOALSAFETY
new CVAR_KICK
new Float:CVAR_RESPAWN
new CVAR_RANDOM
new CVAR_KILLNEARBALL
new CVAR_KILLNEARHOLDER
new fire
new smoke
new beamspr
new g_fxBeamSprite
new Burn_Sprite
new ballholder
new ballowner
new aball
new is_kickball
new g_TimeLimit;
new bool:has_knife[MAX_PLAYER]
new pop=1
new OFFSET_INTERNALMODEL;
/*====================================================================================================
[Precache]
Purpose: $$
Comment: $$
====================================================================================================*/
PrecacheSounds() {
new x
for(x=0;x<MAX_SOUNDS;x++)
engfunc( EngFunc_PrecacheSound, SCORED_SOUNDS[x])
engfunc( EngFunc_PrecacheSound, STOLE_BALL_FAST)
engfunc( EngFunc_PrecacheSound, ROUND_START)
engfunc( EngFunc_PrecacheSound, BALL_BOUNCE_GROUND)
engfunc( EngFunc_PrecacheSound, BALL_PICKED_UP)
engfunc( EngFunc_PrecacheSound, BALL_RESPAWN)
engfunc( EngFunc_PrecacheSound, SCORED_GOAL)
engfunc( EngFunc_PrecacheSound, BALL_KICKED)
engfunc( EngFunc_PrecacheSound, UPGRADED_MAX_LEVEL)
}
PrecacheBall() {
engfunc( EngFunc_PrecacheModel, ball)
}
PrecacheMonsters(team) {
engfunc( EngFunc_PrecacheModel, TeamMascots[team-1])
}
PrecacheSprites() {
beamspr = engfunc( EngFunc_PrecacheModel,"sprites/laserbeam.spr")
fire = engfunc( EngFunc_PrecacheModel,"sprites/shockwave.spr")
smoke = engfunc( EngFunc_PrecacheModel,"sprites/steam1.spr")
Burn_Sprite = engfunc( EngFunc_PrecacheModel,"sprites/xfireball3.spr")
g_fxBeamSprite = engfunc( EngFunc_PrecacheModel,"sprites/lgtning.spr")
}
PrecacheOther() {
engfunc( EngFunc_PrecacheModel, "models/chick.mdl")
}
/*====================================================================================================
[Initialize]
Purpose: $$
Comment: $$
====================================================================================================*/
public plugin_init() {
new mapname[64]
get_mapname(mapname,63)
register_cvar("soccer_jam_online", "0", FCVAR_SERVER)
register_cvar("soccer_jam_version", VERSION, FCVAR_SERVER)
set_cvar_string("soccer_jam_version", VERSION)
register_dictionary("soccerjam.txt")
register_dictionary("soccerjam_help.txt")
if(is_kickball > 0)
{
PrecacheSprites()
register_plugin("Soccer Jam(ON)", VERSION, AUTHOR)
set_cvar_num("soccer_jam_online", 1)
timer = COUNTDOWN_TIME
gmsgTextMsg = get_user_msgid("TextMsg")
gmsgDeathMsg = get_user_msgid("DeathMsg")
gmsgShake = get_user_msgid("ScreenShake")
gmsgSayText = get_user_msgid("SayText")
maxplayers = get_maxplayers()
if(equali(mapname,"soccerjam")) {
PrecacheOther()
CreateGoalNets()
create_wall()
}
register_clcmd("say","handle_say")
register_event("ResetHUD", "Event_ResetHud", "be")
register_event("HLTV","Event_StartRound","a","1=0","2=0")
register_event("Damage", "Event_Damage", "b", "2!0", "3=0", "4!0" )
CVAR_SCORE = register_cvar("sj_score","12")
CVAR_RESET = register_cvar("sj_reset","30.0")
CVAR_GOALSAFETY = register_cvar("sj_goalsafety","725")
CVAR_KICK = register_cvar("sj_kick","680")
CVAR_RESPAWN = 2.0 //register_cvar("kickball_respawn","2.0")
CVAR_RANDOM = register_cvar("sj_random","1")
CVAR_KILLNEARBALL = register_cvar("sj_kill_distance_ball", "200.0")
CVAR_KILLNEARHOLDER = register_cvar("sj_kill_distance_holder", "96.0")
register_cvar( "sj_timelimit", "0" );
register_cvar("SCORE_CT","0")
register_cvar("SCORE_T","0")
register_menucmd(register_menuid("Team_Select",1), (1<<0)|(1<<1)|(1<<4)|(1<<5), "team_select")
register_touch("PwnBall", "player", "touchPlayer")
register_touch("PwnBall", "soccerjam_goalnet", "touchNet")
register_touch("PwnBall", "worldspawn", "touchWorld")
register_touch("PwnBall", "func_wall", "touchWorld")
register_touch("PwnBall", "func_door", "touchWorld")
register_touch("PwnBall", "func_door_rotating", "touchWorld")
register_touch("PwnBall", "func_wall_toggle", "touchWorld")
register_touch("PwnBall", "func_breakable", "touchWorld")
register_touch("PwnBall", "Blocker", "touchBlocker")
register_touch("player", "player","touchtouch")
set_task(0.4,"meter",0,_,_,"b")
set_task(0.5,"statusDisplay",7654321,"",0,"b")
register_think("PwnBall","ball_think")
register_think("Mascot", "mascot_think")
register_clcmd("radio1", "LeftDirection", 0)
register_clcmd("radio2", "RightDirection", 0)
register_clcmd("drop","Turbo")
register_clcmd("lastinv","BuyUpgrade")
register_clcmd("fullupdate","fullupdate")
register_message(gmsgTextMsg, "editTextMsg")
register_event("ShowMenu", "menuclass", "b", "4&CT_Select", "4&Terrorist_Select");
register_event("VGUIMenu", "menuclass", "b", "1=26", "1=27");
OFFSET_INTERNALMODEL = is_amd64_server() ? 152 : 126;
}
else {
register_plugin("Soccer Jam(OFF)", VERSION, AUTHOR)
set_cvar_num("soccer_jam_online",0)
}
return PLUGIN_HANDLED
}
//public plugin_end() {
//server_cmd("mp_timelimit %i", g_TimeLimit)
//}
/*====================================================================================================
[Initialize Entities]
Purpose: Handles our custom entities, created with Valve Hammer, and fixes for soccerjam.bsp.
Comment: $$
====================================================================================================*/
public pfn_keyvalue(entid) {
new classname[32], key[32], value[32]
copy_keyvalue(classname, 31, key, 31, value, 31)
new temp_origins[3][10], x, team
new temp_angles[3][10]
if(equal(key, "classname") && equal(value, "soccerjam_goalnet"))
DispatchKeyValue("classname", "func_wall")
if(equal(classname, "game_player_equip")){
if(!is_kickball || !gamePlayerEquip)
gamePlayerEquip = entid
else {
remove_entity(entid)
}
}
else if(equal(classname, "func_wall"))
{
if(equal(key, "team"))
{
team = str_to_num(value)
if(team == 1 || team == 2) {
GoalEnt[team] = entid
set_task(1.0, "FinalizeGoalNet", team)
}
}
}
else if(equal(classname, "soccerjam_mascot"))
{
if(equal(key, "team"))
{
team = str_to_num(value)
create_mascot(team)
}
else if(equal(key, "origin"))
{
parse(value, temp_origins[0], 9, temp_origins[1], 9, temp_origins[2], 9)
for(x=0; x<3; x++)
MascotsOrigins[x] = floatstr(temp_origins[x])
}
else if(equal(key, "angles"))
{
parse(value, temp_angles[0], 9, temp_angles[1], 9, temp_angles[2], 9)
for(x=0; x<3; x++)
MascotsAngles[x] = floatstr(temp_angles[x])
}
}
else if(equal(classname, "soccerjam_teamball"))
{
if(equal(key, "team"))
{
team = str_to_num(value)
for(x=0; x<3; x++)
TeamBallOrigins[team][x] = TEMP_TeamBallOrigins[x]
}
else if(equal(key, "origin"))
{
parse(value, temp_origins[0], 9, temp_origins[1], 9, temp_origins[2], 9)
for(x=0; x<3; x++)
TEMP_TeamBallOrigins[x] = floatstr(temp_origins[x])
}
}
else if(equal(classname, "soccerjam_ballspawn"))
{
if(equal(key, "origin")) {
is_kickball = 1
create_Game_Player_Equip()
PrecacheBall()
PrecacheSounds()
if(ballspawncount < MAX_BALL_SPAWNS) {
parse(value, temp_origins[0], 9, temp_origins[1], 9, temp_origins[2], 9)
BallSpawnOrigin[ballspawncount][0] = floatstr(temp_origins[0])
BallSpawnOrigin[ballspawncount][1] = floatstr(temp_origins[1])
BallSpawnOrigin[ballspawncount][2] = floatstr(temp_origins[2]) + 10.0
ballspawncount++
}
}
}
}
createball() {
new entity = create_entity("info_target")
if (entity) {
entity_set_string(entity,EV_SZ_classname,"PwnBall")
entity_set_model(entity, ball)
entity_set_int(entity, EV_INT_solid, SOLID_BBOX)
entity_set_int(entity, EV_INT_movetype, MOVETYPE_BOUNCE)
new Float:MinBox[3]
new Float:MaxBox[3]
MinBox[0] = -15.0
MinBox[1] = -15.0
MinBox[2] = 0.0
MaxBox[0] = 15.0
MaxBox[1] = 15.0
MaxBox[2] = 12.0
entity_set_vector(entity, EV_VEC_mins, MinBox)
entity_set_vector(entity, EV_VEC_maxs, MaxBox)
glow(entity,ballcolor[0],ballcolor[1],ballcolor[2],10)
entity_set_float(entity,EV_FL_framerate,0.0)
entity_set_int(entity,EV_INT_sequence,0)
}
//save our entity ID to aball variable
aball = entity
entity_set_float(entity,EV_FL_nextthink,halflife_time() + 0.05)
return PLUGIN_HANDLED
}
CreateGoalNets() {
new endzone, x
new Float:orig[3]
new Float:MinBox[3], Float:MaxBox[3]
for(x=1;x<3;x++) {
endzone = create_entity("info_target")
if (endzone) {
entity_set_string(endzone,EV_SZ_classname,"soccerjam_goalnet")
entity_set_model(endzone, "models/chick.mdl")
entity_set_int(endzone, EV_INT_solid, SOLID_BBOX)
entity_set_int(endzone, EV_INT_movetype, MOVETYPE_NONE)
MinBox[0] = -25.0; MinBox[1] = -145.0; MinBox[2] = -36.0
MaxBox[0] = 25.0; MaxBox[1] = 145.0; MaxBox[2] = 70.0
entity_set_vector(endzone, EV_VEC_mins, MinBox)
entity_set_vector(endzone, EV_VEC_maxs, MaxBox)
switch(x) {
case 1: {
orig[0] = 2110.0
orig[1] = 0.0
orig[2] = 1604.0
}
case 2: {
orig[0] = -2550.0
orig[1] = 0.0
orig[2] = 1604.0
}
}
entity_set_origin(endzone,orig)
entity_set_int(endzone, EV_INT_team, x)
set_entity_visibility(endzone, 0)
GoalEnt[x] = endzone
}
}
}
create_wall() {
new wall = create_entity("func_wall")
if(wall)
{
new Float:orig[3]
new Float:MinBox[3], Float:MaxBox[3]
entity_set_string(wall,EV_SZ_classname,"Blocker")
entity_set_model(wall, "models/chick.mdl")
entity_set_int(wall, EV_INT_solid, SOLID_BBOX)
entity_set_int(wall, EV_INT_movetype, MOVETYPE_NONE)
MinBox[0] = -72.0; MinBox[1] = -100.0; MinBox[2] = -72.0
MaxBox[0] = 72.0; MaxBox[1] = 100.0; MaxBox[2] = 72.0
entity_set_vector(wall, EV_VEC_mins, MinBox)
entity_set_vector(wall, EV_VEC_maxs, MaxBox)
orig[0] = 2355.0
orig[1] = 1696.0
orig[2] = 1604.0
entity_set_origin(wall,orig)
set_entity_visibility(wall, 0)
}
}
create_mascot(team)
{
new Float:MinBox[3], Float:MaxBox[3]
new mascot = create_entity("info_target")
if(mascot)
{
PrecacheMonsters(team)
entity_set_string(mascot,EV_SZ_classname,"Mascot")
entity_set_model(mascot, TeamMascots[team-1])
Mascots[team] = mascot
entity_set_int(mascot, EV_INT_solid, SOLID_NOT)
entity_set_int(mascot, EV_INT_movetype, MOVETYPE_NONE)
entity_set_int(mascot, EV_INT_team, team)
MinBox[0] = -16.0; MinBox[1] = -16.0; MinBox[2] = -72.0
MaxBox[0] = 16.0; MaxBox[1] = 16.0; MaxBox[2] = 72.0
entity_set_vector(mascot, EV_VEC_mins, MinBox)
entity_set_vector(mascot, EV_VEC_maxs, MaxBox)
//orig[2] += 200.0
entity_set_origin(mascot,MascotsOrigins)
entity_set_float(mascot,EV_FL_animtime,2.0)
entity_set_float(mascot,EV_FL_framerate,1.0)
entity_set_int(mascot,EV_INT_sequence,0)
if(team == 2)
entity_set_byte(mascot, EV_BYTE_controller1, 115)
entity_set_vector(mascot,EV_VEC_angles,MascotsAngles)
entity_set_float(mascot,EV_FL_nextthink,halflife_time() + 1.0)
}
}
create_Game_Player_Equip() {
gamePlayerEquip = create_entity("game_player_equip")
if(gamePlayerEquip) {
//DispatchKeyValue(gamePlayerEquip, "weapon_knife", "1")
//DispatchKeyValue(entity, "weapon_scout", "1")
DispatchKeyValue(gamePlayerEquip, "targetname", "roundstart")
DispatchSpawn(gamePlayerEquip)
}
}
public FinalizeGoalNet(team)
{
new goalnet = GoalEnt[team]
entity_set_string(goalnet,EV_SZ_classname,"soccerjam_goalnet")
entity_set_int(goalnet, EV_INT_team, team)
set_entity_visibility(goalnet, 0)
}
public RightDirection(id) {
if(id == ballholder) {
direction--
if(direction < -(DIRECTIONS))
direction = -(DIRECTIONS)
new temp = direction * CURVE_ANGLE
SendCenterText( id, temp );
}
else
client_print(id, print_chat, "%L", id, "CANT_CURVE_RIGHT");
return PLUGIN_HANDLED
}
public LeftDirection(id) {
if(id == ballholder) {
direction++
if(direction > DIRECTIONS)
direction = DIRECTIONS
new temp = direction * CURVE_ANGLE
SendCenterText( id, temp );
}
else {
client_print(id, print_chat, "%L", id, "CANT_CURVE_LEFT");
}
return PLUGIN_HANDLED
}
SendCenterText( id, dir )
{
if(dir < 0)
client_print(id, print_center, "%L", id, "CURVING_RIGHT", (dir<0?-(dir):dir));
else if(dir == 0)
client_print(id, print_center, "0 degrees");
else if(dir > 0)
client_print(id, print_center, "%L", id, "CURVING_LEFT", (dir<0?-(dir):dir));
}
public plugin_cfg() {
if(is_kickball) {
server_cmd("sv_maxspeed 999")
server_cmd("sv_airaccelerate 10")
//Fallback to make sure our mp_timelimit is correct.
new mpTimelimit = get_cvar_num("mp_timelimit");
new sjTimelimit = get_cvar_num("sj_timelimit");
if( mpTimelimit > 3 )
set_cvar_num("sj_timelimit", mpTimelimit);
else {
if(mpTimelimit && sjTimelimit > 3 )
set_cvar_num("mp_timelimit", sjTimelimit);
}
}
else {
//server_cmd("exec server.cfg")
new failed[64];
format(failed,63,"%L", LANG_SERVER, "PLUGIN_FAILED");
set_fail_state(failed);
}
}
/*====================================================================================================
[Ball Brain]
Purpose: These functions help control the ball and its activities.
Comment: $$
====================================================================================================*/
public ball_think() {
new maxscore = get_pcvar_num(CVAR_SCORE)
if(score[1] >= maxscore || score[2] >= maxscore) {
entity_set_float(aball,EV_FL_nextthink,halflife_time() + 0.05)
return PLUGIN_HANDLED
}
if(is_valid_ent(aball))
{
new Float:gametime = get_gametime()
if(PowerPlay >= pop && gametime - fire_delay >= 0.3)
on_fire()
if(ballholder > 0)
{
new team = get_user_team(ballholder)
entity_get_vector(ballholder, EV_VEC_origin,testorigin)
if(!is_user_alive(ballholder)) {
new tname[32]
get_user_name(ballholder,tname,31)
remove_task(55555)
set_task(get_pcvar_float(CVAR_RESET),"clearBall",55555)
if(!g_sprint[ballholder])
set_speedchange(ballholder)
format(temp1,63,"%L", LANG_PLAYER, "DROPPED_BALL", TeamNames[team], tname)
//remove glow of owner and set ball velocity really really low
glow(ballholder,0,0,0,0)
ballowner = ballholder
ballholder = 0
testorigin[2] += 5
entity_set_origin(aball, testorigin)
new Float:vel[3], x
for(x=0;x<3;x++)
vel[x] = 1.0
entity_set_vector(aball,EV_VEC_velocity,vel)
entity_set_float(aball,EV_FL_nextthink,halflife_time() + 0.05)
return PLUGIN_HANDLED
}
if(entity_get_int(aball,EV_INT_solid) != SOLID_NOT)
entity_set_int(aball, EV_INT_solid, SOLID_NOT)
//Put ball in front of player
ball_infront(ballholder, 55.0)
new i
for(i=0;i<3;i++)
velocity[i] = 0.0
//Add lift to z axis
new flags = entity_get_int(ballholder, EV_INT_flags)
if(flags & FL_DUCKING)
testorigin[2] -= 10
else
testorigin[2] -= 30
entity_set_vector(aball,EV_VEC_velocity,velocity)
entity_set_origin(aball,testorigin)
}
else {
if(entity_get_int(aball,EV_INT_solid) != SOLID_BBOX)
entity_set_int(aball, EV_INT_solid, SOLID_BBOX)
}
}
entity_set_float(aball,EV_FL_nextthink,halflife_time() + 0.05)
return PLUGIN_HANDLED
}
moveBall(where, team=0) {
if(is_valid_ent(aball)) {
if(team) {
new Float:bv[3]
bv[2] = 50.0
entity_set_origin(aball, TeamBallOrigins[team])
entity_set_vector(aball,EV_VEC_velocity,bv)
}
else {
switch(where) {
case 0: { //outside map
new Float:orig[3], x
for(x=0;x<3;x++)
orig[x] = -9999.9
entity_set_origin(aball,orig)
ballholder = -1
}
case 1: { //at middle
new Float:v[3], rand
v[2] = 400.0
if(ballspawncount > 1)
rand = random_num(0, ballspawncount-1)
else
rand = 0
entity_set_origin(aball, BallSpawnOrigin[rand])
entity_set_vector(aball, EV_VEC_velocity, v)
PowerPlay = 0
ballholder = 0
ballowner = 0
}
}
}
}
}
public ball_infront(id, Float:dist) {
new Float:nOrigin[3]
new Float:vAngles[3] // plug in the view angles of the entity
new Float:vReturn[3] // to get out an origin fDistance away
entity_get_vector(aball,EV_VEC_origin,testorigin)
entity_get_vector(id,EV_VEC_origin,nOrigin)
entity_get_vector(id,EV_VEC_v_angle,vAngles)
vReturn[0] = floatcos( vAngles[1], degrees ) * dist
vReturn[1] = floatsin( vAngles[1], degrees ) * dist
vReturn[0] += nOrigin[0]
vReturn[1] += nOrigin[1]
testorigin[0] = vReturn[0]
testorigin[1] = vReturn[1]
testorigin[2] = nOrigin[2]
/*
//Sets the angle to face the same as the player.
new Float:ang[3]
entity_get_vector(id,EV_VEC_angles,ang)
ang[0] = 0.0
ang[1] -= 90.0
ang[2] = 0.0
entity_set_vector(aball,EV_VEC_angles,ang)
*/
}
public CurveBall(id) {
if(direction && get_speed(aball) > 5 && curvecount > 0) {
new Float:dAmt = float((direction * CURVE_ANGLE) / ANGLEDIVIDE);
new Float:v[3], Float:v_forward[3];
entity_get_vector(aball, EV_VEC_velocity, v);
vector_to_angle(v, BallSpinDirection);
BallSpinDirection[1] = normalize( BallSpinDirection[1] + dAmt );
BallSpinDirection[2] = 0.0;
angle_vector(BallSpinDirection, 1, v_forward);
new Float:speed = vector_length(v)// * 0.95;
v[0] = v_forward[0] * speed
v[1] = v_forward[1] * speed
entity_set_vector(aball, EV_VEC_velocity, v);
curvecount--;
set_task(CURVE_TIME, "CurveBall", id);
}
}
public clearBall() {
play_wav(0, BALL_RESPAWN);
format(temp1,63,"%L",LANG_PLAYER,"BALL_RESPAWNED")
moveBall(1)
}
/*====================================================================================================
[Mascot Think]
Purpose: $$
Comment: $$
====================================================================================================*/
public mascot_think(mascot)
{
new team = entity_get_int(mascot, EV_INT_team)
new indist[32], inNum, chosen
new id, playerteam, dist
for(id=1 ; id<=maxplayers ; id++)
{
if(is_user_alive(id))
{
playerteam = get_user_team(id)
if(playerteam != team)
{
if(!chosen) {
dist = get_entity_distance(id, mascot)
if(dist < get_pcvar_num(CVAR_GOALSAFETY))
if(id == ballholder) {
chosen = id
break
}
else
indist[inNum++] = id
}
}
}
}
if(!chosen) {
new rnd = random_num(0, (inNum-1))
chosen = indist[rnd]
}
if(chosen)
TerminatePlayer(chosen, mascot, team, ( ballholder == chosen ? 230.0 : random_float(10.0, 20.0) ) )
entity_set_float(mascot,EV_FL_nextthink,halflife_time() + 0.50)
}
goaly_checker(id, Float:gametime, team) {
if(!is_user_alive(id) || (gametime - GoalyCheckDelay[id] < GOALY_DELAY) )
return PLUGIN_HANDLED
new dist, gcheck
new Float:pOrig[3]
entity_get_vector(id, EV_VEC_origin, pOrig)
dist = floatround(get_distance_f(pOrig, TeamBallOrigins[team]))
//--/* Goaly Exp System */--//
if(dist < 600 ) {
gcheck = GoalyCheck[id]
if(id == ballholder && gcheck >= 2)
kickBall(id, 1)
GoalyPoints[id]++
if(gcheck < 2)
g_Experience[id] += gcheck * AMOUNT_GOALY
else
g_Experience[id] += gcheck * (AMOUNT_GOALY / 2)
if(gcheck < 5)
GoalyCheck[id]++
GoalyCheckDelay[id] = gametime
}
else
GoalyCheck[id] = 0
return PLUGIN_HANDLED
}
/*====================================================================================================
[Status Display]
Purpose: Displays the Scoreboard information.
Comment: $$
====================================================================================================*/
public statusDisplay()
{
new id, team, bteam = get_user_team(ballholder>0?ballholder:ballowner)
new score_t = score[T], score_ct = score[CT]
set_hudmessage(20, 255, 20, 0.95, 0.20, 0, 1.0, 1.5, 0.1, 0.1, HUD_CHANNEL)
new Float:gametime = get_gametime()
for(id=1; id<=maxplayers; id++) {
if(is_user_connected(id))
{
team = get_user_team(id)
goaly_checker(id, gametime, team)
if(!is_user_alive(id) && !is_dead[id] && (team == 1 || team == 2) && GetPlayerModel(id) != 0xFF)
{
//new Float:ballorig[3], x
//entity_get_vector(id,EV_VEC_origin,ballorig)
//for(x=0;x<3;x++)
// distorig[0][x] = floatround(ballorig[x])
remove_task(id+1000)
has_knife[id] = false;
is_dead[id] = true
new Float:respawntime = CVAR_RESPAWN
set_task(respawntime,"AutoRespawn",id)
set_task((respawntime+0.2), "AutoRespawn2",id)
}
if(!winner) {
format(scoreboard,1024," %i %L^n%s - %i | %s - %i ^n%L %i ^n^n%s^n^n^n%s",get_pcvar_num(CVAR_SCORE),id,"GOALS_WINS",TeamNames[T],score_t,TeamNames[CT],score_ct,id,"EXPERIENCE",g_Experience[id],temp1,team==bteam?temp2:"")
show_hudmessage(id,"%s",scoreboard)
}
}
}
}
/*====================================================================================================
[Touched]
Purpose: All touching stuff takes place here.
Comment: $$
====================================================================================================*/
public touchWorld(ball, world) {
if(get_speed(ball) > 10)
{
new Float:v[3]
entity_get_vector(ball, EV_VEC_velocity, v)
v[0] = (v[0] * 0.85)
v[1] = (v[1] * 0.85)
v[2] = (v[2] * 0.85)
entity_set_vector(ball, EV_VEC_velocity, v)
emit_sound(ball, CHAN_ITEM, BALL_BOUNCE_GROUND, 1.0, ATTN_NORM, 0, PITCH_NORM)
}
return PLUGIN_HANDLED
}
public touchPlayer(ball, player) {
new playerteam = get_user_team(player)
if((playerteam != 1 && playerteam != 2))
return PLUGIN_HANDLED
remove_task(55555)
new aname[64], stolen, x
get_user_name(player,aname,63)
new ballteam = get_user_team(ballowner)
if(ballowner > 0 && playerteam != ballteam )
{
new speed = get_speed(aball)
if(speed > 500)
{
//configure catching algorithm
new rnd = random_num(0,100)
new bstr = (PlayerUpgrades[ballowner][STR] * AMOUNT_STR) / 10
new dex = (PlayerUpgrades[player][DEX] * AMOUNT_DEX)
new pct = ( PressedAction[player] ? 40:20 ) + dex
pct += ( g_sprint[player] ? 5 : 0 ) //player turboing? give 5%
pct -= ( g_sprint[ballowner] ? 5 : 0 ) //ballowner turboing? lose 5%
pct -= bstr //ballowner has strength? remove bstr
//will player avoid damage?
if( rnd > pct ) {
new Float:dodmg = (float(speed) / 13.0) + bstr
client_print(0,print_chat,"%L",LANG_PLAYER,"BALL_SMACKED",aname,floatround(dodmg))
fakedamage(player,"AssWhoopin",dodmg,1)
//set_msg_block(gmsgDeathMsg,BLOCK_ONCE)
//new health=get_user_health(player)
//set_user_health ( player, health -floatround(dodmg))
//set_msg_block(gmsgDeathMsg,BLOCK_NOT)
if(!is_user_alive(player)) {
message_begin(MSG_ALL, gmsgDeathMsg)
write_byte(ballowner)
write_byte(player)
write_string("AssWhoopin")
message_end()
new frags = get_user_frags(ballowner)
entity_set_float(ballowner, EV_FL_frags, float(frags + 1))
setScoreInfo(ballowner)
//set_user_frags(ballowner, get_user_frags(ballowner)+1)
Event_Record(ballowner, KILL, -1, EXP_KILL)
client_print(player,print_chat,"%L",player,"KILLED_BY_BALL")
client_print(ballowner,print_chat,"%L",ballowner,"EXP_FOR_BALLKILL")
}
else {
new Float:pushVel[3]
pushVel[0] = velocity[0]
pushVel[1] = velocity[1]
pushVel[2] = velocity[2] + ((velocity[2] < 0)?random_float(-200.0,-50.0):random_float(50.0,200.0))
entity_set_vector(player,EV_VEC_velocity,pushVel)
}
for(x=0;x<3;x++)
velocity[x] = (velocity[x] * random_float(0.1,0.9))
entity_set_vector(aball,EV_VEC_velocity,velocity)
direction = 0
return PLUGIN_HANDLED
}
}
if(speed > 950)
play_wav(0, STOLE_BALL_FAST)
new Float:pOrig[3]
entity_get_vector(player, EV_VEC_origin, pOrig)
new dist = floatround(get_distance_f(pOrig, TeamBallOrigins[playerteam]))
new gainedxp
if(dist < 550) {
gainedxp = EXP_STEAL + EXP_GOALY + (speed / 8)
Event_Record(player, STEAL, -1, EXP_STEAL + EXP_GOALY + (speed / 8))
GoalyPoints[player] += EXP_GOALY/2
}
else {
gainedxp = EXP_STEAL
Event_Record(player, STEAL, -1, EXP_STEAL)
}
format(temp1,63,"%L",LANG_PLAYER,"STOLE_BALL",TeamNames[playerteam],aname)
client_print(0,print_console,"%s",temp1)
stolen = 1
message_begin(MSG_ONE, gmsgShake, {0,0,0}, player)
write_short(255 << 12) //ammount
write_short(1 << 11) //lasts this long
write_short(255 << 10) //frequency
message_end()
client_print(player,print_chat,"%L",player,"EXP_FOR_STEAL",gainedxp)
}
if(ballholder == 0) {
emit_sound(aball, CHAN_ITEM, BALL_PICKED_UP, 1.0, ATTN_NORM, 0, PITCH_NORM)
new msg[64], check
if(!has_knife[player])
give_knife(player)
if(stolen)
PowerPlay = 0
else
format(temp1,63,"%L",LANG_PLAYER,"BALL_PICKUP",TeamNames[playerteam],aname)
if(((PowerPlay > 1 && powerplay_list[PowerPlay-2] == player) || (PowerPlay > 0 && powerplay_list[PowerPlay-1] == player)) && PowerPlay != MAX_LVL_POWERPLAY)
check = true
if(PowerPlay <= MAX_LVL_POWERPLAY && !check) {
g_Experience[player] += (PowerPlay==2?10:25)
powerplay_list[PowerPlay] = player
PowerPlay++
new Players[32]
new playerCountT,playerCountCT
get_players(Players, playerCountT, "ce","TERRORIST")
get_players(Players, playerCountCT, "ce","CT")
if((playerCountT>3)&&( playerCountCT>3))pop=3
else if((playerCountT>2)&&( playerCountCT>2)) pop=2
else pop=1
}
curvecount = 0
direction = 0
GoalyCheck[player] = 0
format(temp2, 63, "%L %i",LANG_PLAYER,"POWER_PLAY", PowerPlay>0?PowerPlay-1:0)
ballholder = player
ballowner = 0
if(!g_sprint[player])
set_speedchange(player)
set_hudmessage(255, 20, 20, POS_X, 0.4, 1, 1.0, 1.5, 0.1, 0.1, 2)
format(msg,63,"%L",player,"YOU_HAVE_BALL")
show_hudmessage(player,"%s",msg)
//Glow Player who has ball their team color
beam()
glow(player, TeamColors[playerteam][0], TeamColors[playerteam][1], TeamColors[playerteam][2], 1)
}
return PLUGIN_HANDLED
}
public touchNet(ball, goalpost)
{
remove_task(55555)
new team = get_user_team(ballowner)
new goalent = GoalEnt[team]
if (goalpost != goalent && ballowner > 0) {
new Players[32]
new playerCountT,playerCountCT
get_players(Players, playerCountT, "ce","TERRORIST")
get_players(Players, playerCountCT, "ce","CT")
if((playerCountT>3)&&( playerCountCT>3))pop=3
else if((playerCountT>2)&&( playerCountCT>2)) pop=2
else pop=1
if(PowerPlay<pop){
user_slap(ballowner, 5)
if(get_speed(ball) > 10){
new Float:v[3]
entity_get_vector(ball, EV_VEC_velocity, v)
v[0] = (v[0] * 0.85)
v[1] = (v[1] * 0.85)
v[2] = (v[2] * 0.85)
entity_set_vector(ball, EV_VEC_velocity, v)
emit_sound(ball, CHAN_ITEM, BALL_BOUNCE_GROUND, 1.0, ATTN_NORM, 0, PITCH_NORM)
}
new text[64]
format(text,63,"^x04*** By strzelic bramke PowerPlay musi byc minimum %i ***",pop-1)
message_begin(MSG_ONE, get_user_msgid("SayText"), {0,0,0}, ballowner)
write_byte(ballowner)
write_string(text)
message_end()
client_print(0, print_chat,"By zwiekszyc poziom power play nalezy podawac do swojej druzyny")
client_print(0, print_chat,"Gdy power play bedzie conajmniej %i - bedzie mozna strzelic gola",pop-1)
user_slap(ballowner, 5)
return PLUGIN_HANDLED
}
// Powerpaly ograniczenie koniec
new aname[64]
new Float:netOrig[3]
new netOrig2[3]
entity_get_vector(ball, EV_VEC_origin,netOrig)
new l
for(l=0;l<3;l++)
netOrig2[l] = floatround(netOrig[l])
flameWave(netOrig2)
get_user_name(ballowner,aname,63)
new frags = get_user_frags(ballowner)
entity_set_float(ballowner, EV_FL_frags, float(frags + 10))
play_wav(0, SCORED_GOAL)
/////////////////////ASSIST CODE HERE///////////
new assisters[4] = { 0, 0, 0, 0 }
new iassisters = 0
new ilastplayer = iassist[ team ]
// We just need the last player to kick the ball
// 0 means it has passed 15 at least once
if ( ilastplayer == 0 )
ilastplayer = 15
else
ilastplayer--
if ( assist[ ilastplayer ] != 0 ) {
new i, x, bool:canadd, playerid
for(i=0; i<16; i++) {
// Stop if we've already found 4 assisters
if ( iassisters == MAX_ASSISTERS )
break
playerid = assist[ i ]
// Skip if player is invalid
if ( playerid == 0 )
continue
// Skip if kicker is counted as an assister
if ( playerid == assist[ ilastplayer ] )
continue
canadd = true
// Loop through each assister value
for(x=0; x<3; x++)
// make sure we can add them
if ( playerid == assisters[ x ] ) {
canadd = false
break
}
// Skip if they've already been added
if ( canadd == false )
continue
// They didn't kick the ball last, and they haven't been added, add them
assisters[ iassisters++ ] = playerid
}
// This gives each person an assist, xp, and prints that out to them
new c, pass
for(c=0; c<iassisters; c++) {
pass = assisters[ c ]
Event_Record(pass, ASSIST, -1, EXP_ASSIST)
client_print( pass, print_chat, "%L",pass,"EXP_FOR_ASSIST",EXP_ASSIST)
}
}
iassist[ 0 ] = 0
/////////////////////ASSIST CODE HERE///////////
for(l=0; l<3; l++)
distorig[1][l] = floatround(netOrig[l])
new distshot = (get_distance(distorig[0],distorig[1])/12)
new gainedxp = distshot + EXP_GOAL
format(temp1,63,"%L",LANG_PLAYER,"SCORED_GOAL",TeamNames[team],aname,distshot)
client_print(0,print_console,"%s",temp1)
if(distshot > MadeRecord[ballowner][DISTANCE])
Event_Record(ballowner, DISTANCE, distshot, 0)// record distance, and make that distance exp
Event_Record(ballowner, GOAL, -1, gainedxp) //zero xp for goal cause distance is what gives it.
//Increase Score, and update cvar score
score[team]++
switch(team) {
case 1: set_cvar_num("score_ct",score[team])
case 2: set_cvar_num("score_t",score[team])
}
client_print(ballowner,print_chat,"%L",ballowner,"EXP_FOR_GOAL",gainedxp,distshot)
new oteam = (team == 1 ? 2 : 1)
increaseTeamXP(team, 75)
increaseTeamXP(oteam, 50)
moveBall(0)
new x
for(x=1; x<=maxplayers; x++) {
if(is_user_connected(x))
{
Event_Record(x, GOALY, GoalyPoints[x], 0)
new kills = get_user_frags(x)
new deaths = cs_get_user_deaths(x)
setScoreInfo(x)
if( deaths > 0)
PlayerDeaths[x] = deaths
if( kills > 0)
PlayerKills[x] = kills
}
}
if(score[team] < get_pcvar_num(CVAR_SCORE)) {
new r = random_num(0,MAX_SOUNDS-1)
play_wav(0, SCORED_SOUNDS[r]);
}
else {
winner = team
format(scoreboard,1024,"%L",LANG_PLAYER,"TEAM_WINS",TeamNames[team])
set_task(1.0,"showhud_winner",0,"",0,"a",3)
}
server_cmd("sv_restart 4")
}
else if(goalpost == goalent) {
moveBall(0, team)
client_print(ballowner,print_chat,"%L",ballowner,"CANNOT_KICK_GOAL")
}
return PLUGIN_HANDLED
}
//This is for soccerjam.bsp to fix locker room.
public touchBlocker(pwnball, blocker) {
new Float:orig[3] = { 2234.0, 1614.0, 1604.0 }
entity_set_origin(pwnball, orig)
}
/*====================================================================================================
[Events]
Purpose: $$
Comment: $$
====================================================================================================*/
//public Event_DeathMsg() {
// new id = read_data(2)
// strip_user_weapons(id);
//}
public Event_Damage()
{
new victim = read_data(0)
new attacker = get_user_attacker(victim)
if(is_user_alive(attacker)) {
if(is_user_alive(victim) ) {
#if !defined KNIFE_DISARM_ON
if(victim == ballholder) {
#endif
new upgrade = PlayerUpgrades[attacker][DISARM]
if(upgrade) {
new disarm = upgrade * AMOUNT_DISARM
new disarmpct = BASE_DISARM + (victim==ballholder?(disarm*2):0)
new rand = random_num(1,100)
if(disarmpct >= rand)
{
new vname[32], aname[32]
get_user_name(victim,vname,31)
get_user_name(attacker,aname,31)
#if defined KNIFE_DISARM_ON
if(victim == ballholder) {
#endif
kickBall(victim, 1)
client_print(attacker,print_chat,"%L",attacker,"DISARM_BALL_ATTACKER",vname)
client_print(victim,print_chat,"%L",victim,"DISARM_BALL_VICTIM",aname)
#if defined KNIFE_DISARM_ON
}
else {
new weapon, clip, ammo
weapon = get_user_weapon(victim,clip,ammo)
if(weapon == CSW_KNIFE)
{
strip_user_weapons(victim);
has_knife[victim] = false;
set_task(float(disarm / DISARM_MULTIPLIER), "give_knife", victim+1000)
client_print(attacker,print_chat,"%L",attacker,"DISARM_KNIFE_ATTACKER",vname)
client_print(victim,print_chat,"%L",victim,"DISARM_KNIFE_VICTIM",aname)
}
}
#endif
}
}
#if !defined KNIFE_DISARM_ON
}
#endif
}
else
g_Experience[attacker] += (EXP_KILL/2)
}
}
public Event_StartRound()
{
g_TimeLimit = get_cvar_num("mp_timelimit");
if(winner)
{
set_task(1.0,"displayWinnerAwards",0)
//MP_TIMELIMIT replication
new Float:gtime = float(g_TimeLimit) - (get_gametime() / 60.0);
if( g_TimeLimit && gtime <= 0.0 )
{
//Fix for Map Vote plugins (2 min marker).
new bool:check;
if(cvar_exists("amx_extendmap_max"))
check = true;
server_cmd("mp_timelimit %i", (check ? 2 : 1));
set_task(10.0, "CheckExtendMap", 555666, "", 0, "b");
}
else
set_task(10.0,"PostGame",0)
}
else
SetupRound()
}
public CheckExtendMap() {
new timelimit = get_cvar_num("mp_timelimit");
if(timelimit > g_TimeLimit) {
PostGame();
remove_task(555666);
}
}
public SetupRound() {
iassist[ 0 ] = 0
if(!is_valid_ent(aball))
createball()
moveBall(1)
new id
for(id=1; id<=maxplayers; id++) {
if(is_user_connected(id)) {
is_dead[id] = false
seconds[id] = 0
g_sprint[id] = 0
PressedAction[id] = 0
}
}
play_wav(0, ROUND_START)
set_task(0.5, "PostSetupRound", 0)
set_task(1.0, "PostPostSetupRound", 0)
return PLUGIN_HANDLED
}
public PostSetupRound() {
new id
for(id=1; id<=maxplayers; id++)
if(is_user_alive(id))
give_knife(id)
}
public PostPostSetupRound() {
new id, kills, deaths
for(id=1; id<=maxplayers; id++) {
if(is_user_connected(id)) {
kills = PlayerKills[id]
deaths = PlayerDeaths[id]
if(kills)
entity_set_float(id, EV_FL_frags, float(kills))
if(deaths)
cs_set_user_deaths(id,deaths)
setScoreInfo(id)
}
}
}
public Event_ResetHud(id) {
goaldied[id] = 0
set_task(1.0,"PostResetHud",id)
}
public PostResetHud(id) {
if(is_user_alive(id))
{
new stam = PlayerUpgrades[id][STA]
if(!has_knife[id]) {
give_knife(id)
}
//compensate for our turbo
if(!g_sprint[id])
set_speedchange(id)
if(stam > 0)
entity_set_float(id, EV_FL_health, float(BASE_HP + (stam * AMOUNT_STA)))
}
}
/*====================================================================================================
[Client Commands]
Purpose: $$
Comment: $$
====================================================================================================*/
public Turbo(id)
{
if(is_user_alive(id))
g_sprint[id] = 1
return PLUGIN_HANDLED
}
public client_PreThink(id)
{
if( is_kickball && is_valid_ent(aball) && is_user_connected(id))
{
new button = entity_get_int(id, EV_INT_button)
new usekey = (button & IN_USE)
new relokay= (button & IN_RELOAD)
new up = (button & IN_FORWARD)
new down = (button & IN_BACK)
new moveright = (button & IN_MOVERIGHT)
new moveleft = (button & IN_MOVELEFT)
new jump = (button & IN_JUMP)
new flags = entity_get_int(id, EV_INT_flags)
new onground = flags & FL_ONGROUND
if( (moveright || moveleft) && !up && !down && jump && onground && !g_sprint[id] && id != ballholder)
SideJump[id] = 1
if(g_sprint[id])
entity_set_float(id, EV_FL_fuser2, 0.0)
if( id != ballholder )
PressedAction[id] = usekey
else {
if( usekey && !PressedAction[id]) {
kickBall(ballholder, 0)
}
else if( relokay && !PressedAction[id]){
kickBall2(ballholder, 0)
}
else if( !usekey && PressedAction[id])
PressedAction[id] = 0
}
if( id != ballholder && (button & IN_ATTACK || button & IN_ATTACK2) ) {
static Float:maxdistance
static reference
if(ballholder > 0) {
reference = ballholder
maxdistance = get_pcvar_float(CVAR_KILLNEARHOLDER)
}
else {
reference = aball
maxdistance = get_pcvar_float(CVAR_KILLNEARBALL)
}
if(!maxdistance)
return
if(entity_range(id, reference) > maxdistance)
entity_set_int(id, EV_INT_button, (button & ~IN_ATTACK) & ~IN_ATTACK2)
}
}
}
public client_PostThink(id) {
if(is_kickball && is_user_connected(id)) {
new Float:gametime = get_gametime()
new button = entity_get_int(id, EV_INT_button)
new up = (button & IN_FORWARD)
new down = (button & IN_BACK)
new moveright = (button & IN_MOVERIGHT)
new moveleft = (button & IN_MOVELEFT)
new jump = (button & IN_JUMP)
new Float:vel[3]
entity_get_vector(id,EV_VEC_velocity,vel)
if( (gametime - SideJumpDelay[id] > 4.5) && SideJump[id] && jump && (moveright || moveleft) && !up && !down) {
vel[0] *= 2.0
vel[1] *= 2.0
vel[2] = 300.0
entity_set_vector(id,EV_VEC_velocity,vel)
SideJump[id] = 0
SideJumpDelay[id] = gametime
}
else
SideJump[id] = 0
}
}
public kickBall(id, velType)
{
remove_task(55555)
set_task(get_pcvar_float(CVAR_RESET),"clearBall",55555)
new team = get_user_team(id)
new a,x
//Give it some lift
ball_infront(id, 55.0)
testorigin[2] += 10
new Float:tempO[3], Float:returned[3]
new Float:dist2
entity_get_vector(id, EV_VEC_origin, tempO)
new tempEnt = trace_line( id, tempO, testorigin, returned )
dist2 = get_distance_f(testorigin, returned)
//ball_infront(id, 55.0)
if( point_contents(testorigin) != CONTENTS_EMPTY || (!is_user_connected(tempEnt) && dist2 ) )//|| tempDist < 65)
return PLUGIN_HANDLED
else
{
//Check Make sure our ball isnt inside a wall before kicking
new Float:ballF[3], Float:ballR[3], Float:ballL[3]
new Float:ballB[3], Float:ballTR[3], Float:ballTL[3]
new Float:ballBL[3], Float:ballBR[3]
for(x=0; x<3; x++) {
ballF[x] = testorigin[x]; ballR[x] = testorigin[x];
ballL[x] = testorigin[x]; ballB[x] = testorigin[x];
ballTR[x] = testorigin[x]; ballTL[x] = testorigin[x];
ballBL[x] = testorigin[x]; ballBR[x] = testorigin[x];
}
for(a=1; a<=6; a++) {
ballF[1] += 3.0; ballB[1] -= 3.0;
ballR[0] += 3.0; ballL[0] -= 3.0;
ballTL[0] -= 3.0; ballTL[1] += 3.0;
ballTR[0] += 3.0; ballTR[1] += 3.0;
ballBL[0] -= 3.0; ballBL[1] -= 3.0;
ballBR[0] += 3.0; ballBR[1] -= 3.0;
if(point_contents(ballF) != CONTENTS_EMPTY || point_contents(ballR) != CONTENTS_EMPTY ||
point_contents(ballL) != CONTENTS_EMPTY || point_contents(ballB) != CONTENTS_EMPTY ||
point_contents(ballTR) != CONTENTS_EMPTY || point_contents(ballTL) != CONTENTS_EMPTY ||
point_contents(ballBL) != CONTENTS_EMPTY || point_contents(ballBR) != CONTENTS_EMPTY)
return PLUGIN_HANDLED
}
new ent = -1
testorigin[2] += 35.0
while((ent = find_ent_in_sphere(ent, testorigin, 35.0)) != 0) {
if(ent > maxplayers)
{
new classname[32]
entity_get_string(ent, EV_SZ_classname, classname, 31)
if((contain(classname, "goalnet") != -1 || contain(classname, "func_") != -1) &&
!equal(classname, "func_water") && !equal(classname, "func_illusionary"))
return PLUGIN_HANDLED
}
}
testorigin[2] -= 35.0
}
new kickVel
if(!velType)
{
new str = (PlayerUpgrades[id][STR] * AMOUNT_STR) + (AMOUNT_POWERPLAY*(PowerPlay*5))
kickVel = get_pcvar_num(CVAR_KICK) + str
kickVel += g_sprint[id] * 100
if(direction) {
entity_get_vector(id, EV_VEC_angles, BallSpinDirection)
curvecount = CURVE_COUNT
}
}
else {
curvecount = 0
direction = 0
kickVel = random_num(100, 600)
}
new Float:ballorig[3]
entity_get_vector(id,EV_VEC_origin,ballorig)
for(x=0; x<3; x++)
distorig[0][x] = floatround(ballorig[x])
velocity_by_aim(id, kickVel, velocity)
for(x=0; x<3; x++)
distorig[0][x] = floatround(ballorig[x])
/////////////////////WRITE ASSIST CODE HERE IF NEEDED///////////
if ( iassist[ 0 ] == team ) {
if ( iassist[ team ] == 15 )
iassist[ team ] = 0
}
else {
// clear the assist list
new ind
for(ind = 0; ind < 16; ind++ )
assist[ ind ] = 0
// clear the assist index
iassist[ team ] = 0
// set which team to track
iassist[ 0 ] = team
}
assist[ iassist[ team ]++ ] = id
/////////////////////WRITE ASSIST CODE HERE IF NEEDED///////////
ballowner = id
ballholder = 0
entity_set_origin(aball,testorigin)
entity_set_vector(aball,EV_VEC_velocity,velocity)
set_task(CURVE_TIME*2, "CurveBall", id)
emit_sound(aball, CHAN_ITEM, BALL_KICKED, 1.0, ATTN_NORM, 0, PITCH_NORM)
glow(id,0,0,0,0)
beam()
new aname[64]
get_user_name(id,aname,63)
if(!g_sprint[id])
set_speedchange(id)
format(temp1,63,"%L",LANG_PLAYER,"KICKED_BALL",TeamNames[team],aname)
client_print(0,print_console,"%s",temp1)
return PLUGIN_HANDLED
}
public kickBall2(id, velType)
{
remove_task(55555)
set_task(get_pcvar_float(CVAR_RESET),"clearBall",55555)
new team = get_user_team(id)
new a,x
//Give it some lift
ball_infront(id, 55.0)
testorigin[2] += 10
new Float:tempO[3], Float:returned[3]
new Float:dist2
entity_get_vector(id, EV_VEC_origin, tempO)
new tempEnt = trace_line( id, tempO, testorigin, returned )
dist2 = get_distance_f(testorigin, returned)
//ball_infront(id, 55.0)
if( point_contents(testorigin) != CONTENTS_EMPTY || (!is_user_connected(tempEnt) && dist2 ) )//|| tempDist < 65)
return PLUGIN_HANDLED
else
{
//Check Make sure our ball isnt inside a wall before kicking
new Float:ballF[3], Float:ballR[3], Float:ballL[3]
new Float:ballB[3], Float:ballTR[3], Float:ballTL[3]
new Float:ballBL[3], Float:ballBR[3]
for(x=0; x<3; x++) {
ballF[x] = testorigin[x]; ballR[x] = testorigin[x];
ballL[x] = testorigin[x]; ballB[x] = testorigin[x];
ballTR[x] = testorigin[x]; ballTL[x] = testorigin[x];
ballBL[x] = testorigin[x]; ballBR[x] = testorigin[x];
}
for(a=1; a<=6; a++) {
ballF[1] += 3.0; ballB[1] -= 3.0;
ballR[0] += 3.0; ballL[0] -= 3.0;
ballTL[0] -= 3.0; ballTL[1] += 3.0;
ballTR[0] += 3.0; ballTR[1] += 3.0;
ballBL[0] -= 3.0; ballBL[1] -= 3.0;
ballBR[0] += 3.0; ballBR[1] -= 3.0;
if(point_contents(ballF) != CONTENTS_EMPTY || point_contents(ballR) != CONTENTS_EMPTY ||
point_contents(ballL) != CONTENTS_EMPTY || point_contents(ballB) != CONTENTS_EMPTY ||
point_contents(ballTR) != CONTENTS_EMPTY || point_contents(ballTL) != CONTENTS_EMPTY ||
point_contents(ballBL) != CONTENTS_EMPTY || point_contents(ballBR) != CONTENTS_EMPTY)
return PLUGIN_HANDLED
}
new ent = -1
testorigin[2] += 35.0
while((ent = find_ent_in_sphere(ent, testorigin, 35.0)) != 0) {
if(ent > maxplayers)
{
new classname[32]
entity_get_string(ent, EV_SZ_classname, classname, 31)
if((contain(classname, "goalnet") != -1 || contain(classname, "func_") != -1) &&
!equal(classname, "func_water") && !equal(classname, "func_illusionary"))
return PLUGIN_HANDLED
}
}
testorigin[2] -= 35.0
}
new kickVel
if(!velType)
{
kickVel = get_pcvar_num(CVAR_KICK)
kickVel += g_sprint[id] * 100
if(direction) {
entity_get_vector(id, EV_VEC_angles, BallSpinDirection)
curvecount = CURVE_COUNT
}
}
else {
curvecount = 0
direction = 0
kickVel = random_num(100, 600)
}
new Float:ballorig[3]
entity_get_vector(id,EV_VEC_origin,ballorig)
for(x=0; x<3; x++)
distorig[0][x] = floatround(ballorig[x])
velocity_by_aim(id, kickVel, velocity)
for(x=0; x<3; x++)
distorig[0][x] = floatround(ballorig[x])
/////////////////////WRITE ASSIST CODE HERE IF NEEDED///////////
if ( iassist[ 0 ] == team ) {
if ( iassist[ team ] == 15 )
iassist[ team ] = 0
}
else {
// clear the assist list
new ind
for(ind = 0; ind < 16; ind++ )
assist[ ind ] = 0
// clear the assist index
iassist[ team ] = 0
// set which team to track
iassist[ 0 ] = team
}
assist[ iassist[ team ]++ ] = id
/////////////////////WRITE ASSIST CODE HERE IF NEEDED///////////
ballowner = id
ballholder = 0
entity_set_origin(aball,testorigin)
entity_set_vector(aball,EV_VEC_velocity,velocity)
set_task(CURVE_TIME*2, "CurveBall", id)
emit_sound(aball, CHAN_ITEM, BALL_KICKED, 1.0, ATTN_NORM, 0, PITCH_NORM)
glow(id,0,0,0,0)
beam()
new aname[64]
get_user_name(id,aname,63)
if(!g_sprint[id])
set_speedchange(id)
format(temp1,63,"%L",LANG_PLAYER,"KICKED_BALL",TeamNames[team],aname)
client_print(0,print_console,"%s",temp1)
return PLUGIN_HANDLED
}
/*====================================================================================================
[Command Blocks]
Purpose: $$
Comment: $$
====================================================================================================*/
public client_kill(id) {
if(is_kickball)
return PLUGIN_HANDLED
return PLUGIN_CONTINUE
}
public client_command(id) {
if(!is_kickball) return PLUGIN_CONTINUE
new arg[13]
read_argv( 0, arg , 12 )
if ( equal("buy",arg) || equal("autobuy",arg) )
return PLUGIN_HANDLED
return PLUGIN_CONTINUE
}
//fix for an exploit.
public menuclass(id) {
// They changed teams
SetPlayerModel(id, 0xFF);
}
GetPlayerModel(id)
{
if(!is_user_connected(id))
return 0;
return get_pdata_int(id, OFFSET_INTERNALMODEL, 5);
}
SetPlayerModel(id, int)
{
if(!is_user_connected(id))
return;
set_pdata_int(id, OFFSET_INTERNALMODEL, int, 5);
}
public team_select(id, key) {
if(is_kickball) {
new team = get_user_team(id)
//SetPlayerModel(id, 0xFF);
if( (team == 1 || team == 2) && (key == team-1) )
{
new message[64]
format(message, 63, "%L",id,"CANT_REJOIN_TEAM")
message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("StatusText"), {0, 0, 0}, id)
write_byte(0)
write_string(message)
message_end()
engclient_cmd(id,"chooseteam")
return PLUGIN_HANDLED
}
}
return PLUGIN_CONTINUE
}
public fullupdate(id)
return PLUGIN_HANDLED
/*====================================================================================================
[Upgrades]
Purpose: This handles the upgrade menu.
Comment: $$
====================================================================================================*/
public BuyUpgrade(id) {
new level[65], num[11], mTitle[101]//, max_count
format(mTitle,100,"%L",id,"MENU_TITLE")
menu_upgrade[id] = menu_create(mTitle, "Upgrade_Handler")
new x
for(x=1; x<=UPGRADES; x++)
{
new price = ((PlayerUpgrades[id][x] * UpgradePrice[x]) / 2) + UpgradePrice[x]
if((PlayerUpgrades[id][x] + 1) > UpgradeMax[x]) {
//max_count++
format(level,64,"\r%s %L",UpgradeTitles[x],id,"MENU_CHOICE_MAXED",UpgradeMax[x])
}
else {
format(level,64,"%s \r%L \y-- \w%i XP",UpgradeTitles[x], id, "MENU_CHOICE_NEXT", PlayerUpgrades[id][x]+1, price)
}
format(num, 10,"%i",x)
menu_additem(menu_upgrade[id], level, num, 0)
}
menu_addblank(menu_upgrade[id], (UPGRADES+1))
menu_setprop(menu_upgrade[id], MPROP_EXIT, MEXIT_NORMAL)
menu_display(id, menu_upgrade[id], 0)
return PLUGIN_HANDLED
}
public Upgrade_Handler(id, menu, item) {
if(item == MENU_EXIT)
return PLUGIN_HANDLED
new cmd[6], iName[64]
new access, callback
menu_item_getinfo(menu, item, access, cmd,5, iName, 63, callback)
new upgrade = str_to_num(cmd)
new playerupgrade = PlayerUpgrades[id][upgrade]
new price = ((playerupgrade * UpgradePrice[upgrade]) / 2) + UpgradePrice[upgrade]
new maxupgrade = UpgradeMax[upgrade]
if(playerupgrade != maxupgrade && playerupgrade != maxupgrade+MAX_LVL_BONUS)
{
new needed = g_Experience[id] - price
if( (needed >= 0) )
{
if(playerupgrade < maxupgrade-1)
playerupgrade += 1
else
playerupgrade += MAX_LVL_BONUS+1
g_Experience[id] -= price
if(playerupgrade < maxupgrade)
client_print(id,print_chat,"%L",id,"MENU_UPGRADED",playerupgrade,UpgradeTitles[upgrade],price)
else {
client_print(id,print_chat,"%L",id,"MENU_UPGRADED",maxupgrade,UpgradeTitles[upgrade],price)
#if(MAX_LVL_BONUS > 1)
client_print(id,print_chat,"%L",id,"MENU_MAX_LVL_BONUS",maxupgrade,MAX_LVL_BONUS)
#else
client_print(id,print_chat,"%L",id,"MENU_MAX_LVL",maxupgrade)
#endif
play_wav(id, UPGRADED_MAX_LEVEL)
}
switch(upgrade) {
case STA: {
new stam = playerupgrade * AMOUNT_STA
entity_set_float(id, EV_FL_health, float(BASE_HP + stam))
}
case AGI: {
if(!g_sprint[id])
set_speedchange(id)
}
}
PlayerUpgrades[id][upgrade] = playerupgrade
}
else
client_print(id,print_chat,"%L",id,"MENU_MISSING_EXP",(needed * -1),(playerupgrade+1),UpgradeTitles[upgrade])
}
else {
client_print(id,print_chat,"%L",id,"MENU_UPGRADE_MAXED",UpgradeTitles[upgrade],maxupgrade)
}
return PLUGIN_HANDLED
}
/*====================================================================================================
[Meters]
Purpose: This controls the turbo meter and curve angle meter.
Comment: $$
====================================================================================================*/
public meter()
{
new id
new turboTitle[32]
new sprintText[128], sec
new r, g, b, team
new len, x
new ndir = -(DIRECTIONS)
format(turboTitle,31,"%L",LANG_PLAYER,"TURBO_TITLE");
for(id=1; id<=maxplayers; id++)
{
if(!is_user_connected(id) || !is_user_alive(id))
continue
sec = seconds[id]
team = get_user_team(id)
r = TeamMeterColors[team][0]
g = TeamMeterColors[team][1]
b = TeamMeterColors[team][2]
if(id == ballholder) {
set_hudmessage(r, g, b, POS_X, 0.75, 0, 0.0, 0.6, 0.0, 0.0, 1)
len = format(sprintText, 127, " %L ^n[",id,"CURVE_TITLE")
for(x=DIRECTIONS; x>=ndir; x--)
if(x==0)
len += format(sprintText[len], 127-len, "%s%s",direction==x?"0":"+", x==ndir?"]":" ")
else
len += format(sprintText[len], 127-len, "%s%s",direction==x?"0":"=", x==ndir?"]":" ")
show_hudmessage(id, "%s", sprintText)
}
set_hudmessage(r, g, b, POS_X, POS_Y, 0, 0.0, 0.6, 0.0, 0.0, 3)
if(sec > 30) {
sec -= 2
format(sprintText, 127, " %s ^n[==============]",turboTitle)
set_speedchange(id)
g_sprint[id] = 0
}
else if(sec >= 0 && sec < 30 && g_sprint[id]) {
sec += 2
set_speedchange(id, 100.0)
}
switch(sec) {
case 0: format(sprintText, 127, " %s ^n[||||||||||||||]",turboTitle)
case 2: format(sprintText, 127, " %s ^n[|||||||||||||=]",turboTitle)
case 4: format(sprintText, 127, " %s ^n[||||||||||||==]",turboTitle)
case 6: format(sprintText, 127, " %s ^n[|||||||||||===]",turboTitle)
case 8: format(sprintText, 127, " %s ^n[||||||||||====]",turboTitle)
case 10: format(sprintText, 127, " %s ^n[|||||||||=====]",turboTitle)
case 12: format(sprintText, 127, " %s ^n[||||||||======]",turboTitle)
case 14: format(sprintText, 127, " %s ^n[|||||||=======]",turboTitle)
case 16: format(sprintText, 127, " %s ^n[||||||========]",turboTitle)
case 18: format(sprintText, 127, " %s ^n[|||||=========]",turboTitle)
case 20: format(sprintText, 127, " %s ^n[||||==========]",turboTitle)
case 22: format(sprintText, 127, " %s ^n[|||===========]",turboTitle)
case 24: format(sprintText, 127, " %s ^n[||============]",turboTitle)
case 26: format(sprintText, 127, " %s ^n[|=============]",turboTitle)
case 28: format(sprintText, 127, " %s ^n[==============]",turboTitle)
case 30: {
format(sprintText, 128, " %s ^n[==============]",turboTitle)
sec = 92
}
case 32: sec = 0
}
seconds[id] = sec
show_hudmessage(id,"%s",sprintText)
}
}
/*====================================================================================================
[Misc.]
Purpose: $$
Comment: $$
====================================================================================================*/
set_speedchange(id, Float:speed=0.0)
{
new Float:agi = float( (PlayerUpgrades[id][AGI] * AMOUNT_AGI) + (id==ballholder?(AMOUNT_POWERPLAY * (PowerPlay*2)):0) )
agi += (BASE_SPEED + speed)
entity_set_float(id,EV_FL_maxspeed, agi)
}
public give_knife(id) {
if(id > 1000)
id -= 1000
remove_task(id+1000)
give_item(id, "weapon_knife")
has_knife[id] = true;
}
Event_Record(id, recordtype, amt, exp) {
if(amt == -1)
MadeRecord[id][recordtype]++
else
MadeRecord[id][recordtype] = amt
new playerRecord = MadeRecord[id][recordtype]
if(playerRecord > TopPlayer[1][recordtype])
{
TopPlayer[0][recordtype] = id
TopPlayer[1][recordtype] = playerRecord
new name[MAX_NAME_LENGTH+1]
get_user_name(id,name,MAX_NAME_LENGTH)
format(TopPlayerName[recordtype],MAX_NAME_LENGTH,"%s",name)
}
g_Experience[id] += exp
}
Float:normalize(Float:nVel)
{
if(nVel > 360.0) {
nVel -= 360.0
}
else if(nVel < 0.0) {
nVel += 360.0
}
return nVel
}
print_message(id, msg[]) {
message_begin(MSG_ONE_UNRELIABLE, gmsgSayText, {0,0,0}, id)
write_byte(id)
write_string(msg)
message_end()
}
public editTextMsg()
{
new string[64], radio[64]
get_msg_arg_string(2, string, 63)
if( get_msg_args() > 2 )
get_msg_arg_string(3, radio, 63)
if(containi(string, "#Game_will_restart") != -1 || containi(radio, "#Game_radio") != -1)
return PLUGIN_HANDLED
return PLUGIN_CONTINUE
}
public client_connect(id)
if(is_kickball)
set_user_info(id,"_vgui_menus","0")
public AutoRespawn(id)
if(is_dead[id] && is_user_connected(id)) {
new team = get_user_team(id)
if(team == 1 || team == 2) {
spawn(id)
}
else
is_dead[id] = false
}
public AutoRespawn2(id)
if(is_dead[id] && is_user_connected(id)) {
new team = get_user_team(id)
if(team == 1 || team == 2) {
spawn(id)
if(!has_knife[id])
give_knife(id)
}
//strip_user_weapons(id)
is_dead[id] = false
}
play_wav(id, wav[])
client_cmd(id,"spk %s",wav)
cmdSpectate(id) {
cs_set_user_team(id, CS_TEAM_SPECTATOR, CS_DONTCHANGE)
if(is_user_alive(id))
user_kill(id)
}
increaseTeamXP(team, amt) {
new id
for(id=1; id<=maxplayers; id++)
if(get_user_team(id) == team && is_user_connected(id))
g_Experience[id] += amt
}
setScoreInfo(id) {
message_begin(MSG_BROADCAST,get_user_msgid("ScoreInfo"));
write_byte(id);
write_short(get_user_frags(id));
write_short(cs_get_user_deaths(id));
write_short(0);
write_short(get_user_team(id));
message_end();
}
// Erase our current temps (used for ball events)
public eraser(num) {
if(num == 3333)
format(temp1,63,"")
if(num == 4444)
format(temp2,63,"")
return PLUGIN_HANDLED
}
/*====================================================================================================
[Cleanup]
Purpose: $$
Comment: $$
====================================================================================================*/
public client_disconnect(id) {
if(is_kickball) {
new x
for(x = 1; x<=RECORDS; x++)
MadeRecord[id][x] = 0
remove_task(id)
if(ballholder == id ) {
ballholder = 0
clearBall()
}
if(ballowner == id) {
ballowner = 0
}
GoalyPoints[id] = 0
PlayerKills[id] = 0
PlayerDeaths[id] = 0
is_dead[id] = false
seconds[id] = 0
g_sprint[id] = 0
PressedAction[id] = 0
has_knife[id] = false;
g_Experience[id] = 0
for(x=1; x<=UPGRADES; x++)
PlayerUpgrades[id][x] = 0
}
}
cleanup() {
new x, id, m
for(x=1;x<=RECORDS;x++) {
TopPlayer[0][x] = 0
TopPlayer[1][x] = 0
TopPlayerName[x][0] = 0
}
for(id=1;id<=maxplayers;id++) {
PlayerDeaths[id] = 0
PlayerKills[id] = 0
//UsedExp[id] = 0
g_Experience[id] = 0
for(x=1;x<=UPGRADES;x++)
PlayerUpgrades[id][x] = 0
for(m = 1; m<=RECORDS; m++)
MadeRecord[id][m] = 0
}
PowerPlay = 0
winner = 0
score[T] = 0
score[CT] = 0
set_cvar_num("score_ct",0)
set_cvar_num("score_t",0)
for(x = 0;x<=cntCT;x++)
ct[x] = 0
for(x = 0; x<= cntT; x++)
terr[x] = 0
cntCT = 0
cntT = 0
}
/*====================================================================================================
[Help]
Purpose: $$
Comment: $$
====================================================================================================*/
public client_putinserver(id) {
if(is_kickball) {
set_task(20.0,"soccerjamHelp",id)
}
}
public soccerjamHelp(id)
{
client_cmd(id, "cl_forwardspeed 1000")
client_cmd(id, "cl_backspeed 1000")
client_cmd(id, "cl_sidespeed 1000")
new name[32]
get_user_name(id,name,31)
client_print(id,print_chat,"========= - [Soccer Jam] v%s - ========",VERSION)
client_print(id,print_chat,"%L",id,"WELCOME_MSG",name)
client_print(id,print_chat,"%L",id,"WELCOME_HELP_MSG")
LateJoinExp(id)
client_print(id,print_chat,"=========------------------========")
}
LateJoinExp(id)
{
new total = (score[T] + score[CT]) * AMOUNT_LATEJOINEXP
if(total) {
g_Experience[id] += total
client_print(id, print_chat, "%L",id,"EXP_FOR_LATEJOIN",total)
}
}
public handle_say(id)
{
new said[192], help[7]
read_args(said,192)
remove_quotes(said)
strcat(help,said,6)
if( (containi(help, "help") != -1) )
soccerjam_help(id)
if( (contain(help, "spec") != -1) )
cmdSpectate(id)
return PLUGIN_CONTINUE
}
public soccerjam_help(id) {
new help_title[64], msg[2047], len
format(help_title,63,"%L",id,"HELP_HEADER")
len = format(msg,2046,"<body bgcolor=#000000><font color=#FFB000><br>")
len += format(msg[len],2046-len,"<center><h2>%L</h2><br><table><tr><td><p><b><font color=#FFB000>",id,"HELP_TITLE")
len += format(msg[len],2046-len,"<h2>%L</h2>",id,"HELP_MOVES_TITLE")
len += format(msg[len],2046-len,"%L<br>",id,"HELP_MOVES_KICK")
len += format(msg[len],2046-len,"%L<br>",id,"HELP_MOVES_CURVELEFT")
len += format(msg[len],2046-len,"%L<br>",id,"HELP_MOVES_CURVERIGHT")
len += format(msg[len],2046-len,"%L<br>",id,"HELP_MOVES_TURBO")
len += format(msg[len],2046-len,"%L<br>",id,"HELP_MOVES_UPGRADE")
len += format(msg[len],2046-len,"%L<br>",id,"HELP_MOVES_DIVE")
len += format(msg[len],2046-len,"%L<br><br>",id,"HELP_MOVES_CATCH")
len += format(msg[len],2046-len,"<h2>%L</h2>",id,"HELP_STATS_TITLE")
len += format(msg[len],2046-len,"%L<br>",id,"HELP_STATS_STAMINA")
len += format(msg[len],2046-len,"%L<br>",id,"HELP_STATS_STRENGTH")
len += format(msg[len],2046-len,"%L<br>",id,"HELP_STATS_AGILITY")
len += format(msg[len],2046-len,"%L<br>",id,"HELP_STATS_DEXTERITY")
len += format(msg[len],2046-len,"%L<br>",id,"HELP_STATS_DISARM")
len += format(msg[len],2046-len,"<h2>%L</h2>",id,"HELP_POWERPLAY_TITLE")
len += format(msg[len],2046-len,"- %L<br>",id,"HELP_POWERPLAY_ONE")
len += format(msg[len],2046-len,"- %L<br>",id,"HELP_POWERPLAY_TWO")
len += format(msg[len],2046-len,"<h2>%L</h2>",id,"HELP_TIPS_TITLE")
len += format(msg[len],2046-len,"- %L<br>",id,"HELP_TIPS_ONE")
len += format(msg[len],2046-len,"- %L<br>",id,"HELP_TIPS_TWO")
len += format(msg[len],2046-len,"- %L<br>",id,"HELP_TIPS_THREE")
len += format(msg[len],2046-len,"</b><br></td></tr></table><br>Soccer Jam made by OneEyed</center>")
show_motd(id,msg,help_title)
}
/*====================================================================================================
[Post Game]
Purpose: $$
Comment: $$
====================================================================================================*/
public showhud_winner() {
set_hudmessage(255, 0, 20, -1.0, 0.35, 1, 1.0, 1.5, 0.1, 0.1, HUD_CHANNEL)
show_hudmessage(0,"%s",scoreboard)
}
public displayWinnerAwards()
{
//If NO steal/assist was made, set name to Nobody
new x
for(x=1;x<=RECORDS;x++)
if(!TopPlayer[0][x])
format(TopPlayerName[x],MAX_NAME_LENGTH,"Nobody")
//Display our Winning Team, with Awards, and kill Comm Chair of opponent
new awards[513]
new len = 0
len += format(awards[len], 512-len, "%s %L^n", (winner == 1 ? "Terrorist" : "CT"), LANG_PLAYER, "AWARDS_HEADER" )
len += format(awards[len], 512-len, "%s - %i | %s - %i^n^n", TeamNames[T],score[T],TeamNames[CT],score[CT])
len += format(awards[len], 512-len, " %L^n",LANG_PLAYER,"AWARDS_TITLE")
len += format(awards[len], 512-len, "%i %L -- %s^n", TopPlayer[1][GOAL], LANG_PLAYER, "AWARDS_GOALS", TopPlayerName[GOAL])
len += format(awards[len], 512-len, "%i %L -- %s^n", TopPlayer[1][STEAL], LANG_PLAYER, "AWARDS_STEALS", TopPlayerName[STEAL])
len += format(awards[len], 512-len, "%i %L -- %s^n", TopPlayer[1][ASSIST], LANG_PLAYER, "AWARDS_ASSISTS", TopPlayerName[ASSIST])
len += format(awards[len], 512-len, "%i %L -- %s^n", TopPlayer[1][KILL], LANG_PLAYER, "AWARDS_BALLKILLS", TopPlayerName[KILL])
len += format(awards[len], 512-len, "%i %L -- %s^n", TopPlayer[1][DISTANCE], LANG_PLAYER, "AWARDS_LONGESTGOAL", TopPlayerName[DISTANCE])
set_hudmessage(250, 130, 20, 0.4, 0.35, 0, 1.0, 10.0, 0.1, 0.1, 2)
show_hudmessage(0, "%s", awards)
}
public PostGame() {
new randomize = get_pcvar_num(CVAR_RANDOM)
if(randomize)
{
set_hudmessage(20, 250, 20, -1.0, 0.55, 1, 1.0, 3.0, 1.0, 0.5, 2)
show_hudmessage(0, "%L",LANG_PLAYER,"RANDOMIZING_TEAMS")
set_task(3.0,"randomize_teams",0)
}
else
BeginCountdown()
}
public BeginCountdown() {
if(!timer) {
timer = COUNTDOWN_TIME
cleanup()
}
else {
new output[32]
num_to_word(timer,output,31)
client_cmd(0,"spk vox/%s.wav",output)
if(timer > (COUNTDOWN_TIME / 2))
set_hudmessage(20, 250, 20, -1.0, 0.55, 1, 1.0, 1.0, 1.0, 0.5, 2)
else
set_hudmessage(255, 0, 0, -1.0, 0.55, 1, 1.0, 1.0, 1.0, 0.5, 2)
if(timer > (COUNTDOWN_TIME - 2))
show_hudmessage(0, "%L^n%i",LANG_PLAYER,"GAME_BEGINS_IN",timer)
else
show_hudmessage(0, "%i",timer)
if(timer == 1)
server_cmd("sv_restart 1")
timer--
set_task(0.9,"BeginCountdown",0)
}
}
/*====================================================================================================
[Team Randomizer]
Purpose: $$
Comment: $$
====================================================================================================*/
public randomize_teams()
{
new terr, ct, id, team, cnt, temp, x, pl_temp
new teams[3][33], player_list[33]
new shuff_t, shuff_ct
new shuffle = random_num(10,30)
//Put all players in one big list
for(id=1; id<=maxplayers; id++)
if(is_user_connected(id)) {
team = get_user_team(id)
if(team == 1 || team == 2)
player_list[cnt++] = id
}
cnt--
//Make a list of Terr and CT players
while(cnt >= 0)
{
if(cnt % 2 == 0)
teams[1][terr++] = player_list[cnt--]
else
teams[2][ct++] = player_list[cnt--]
}
//Shuffle the players
for(x=0;x<=shuffle;x++) {
shuff_t = random_num(0,terr-1);
shuff_ct = random_num(0,ct-1);
temp = teams[1][shuff_t];
teams[1][shuff_t] = teams[2][shuff_ct];
teams[2][shuff_ct] = temp;
}
//Put Players in their team.
for(x=1; x<3; x++)
for(id=0; id<((terr>ct?terr:ct)); id++) {
pl_temp = teams[x][id]
if(is_user_connected(pl_temp)) {
select_model(pl_temp, x, random_num(1,4))
set_task(1.0, "DelayedTeamSwitch", pl_temp+(x*1000))
}
}
set_task(3.0,"BeginCountdown",0)
}
public DelayedTeamSwitch(id) {
new team, msg[124]
if(id >= 2000)
team = 2
else
team = 1
id -= team*1000
format(msg, 123, "^x03 %L",id,"RANDOM_MOVED_TEAM", team==1?"Manchester Londyn":"Chelsea Londyn")
print_message(id, msg)
}
//random model selecting for teamstack
select_model(id, team, model) {
switch(team) {
case 1: {
switch(model) {
case 1: cs_set_user_team(id, CS_TEAM_T, CS_T_TERROR)
case 2: cs_set_user_team(id, CS_TEAM_T, CS_T_LEET)
case 3: cs_set_user_team(id, CS_TEAM_T, CS_T_ARCTIC)
case 4: cs_set_user_team(id, CS_TEAM_T, CS_T_GUERILLA)
}
}
case 2: {
switch(model) {
case 1: cs_set_user_team(id, CS_TEAM_CT, CS_CT_URBAN)
case 2: cs_set_user_team(id, CS_TEAM_CT, CS_CT_GSG9)
case 3: cs_set_user_team(id, CS_TEAM_CT, CS_CT_SAS)
case 4: cs_set_user_team(id, CS_TEAM_CT, CS_CT_GIGN)
case 5: cs_set_user_team(id, CS_TEAM_CT, CS_CT_VIP) //my lil secret
}
}
case 3: {
cs_set_user_team(id, CS_TEAM_SPECTATOR, CS_DONTCHANGE)
if(is_user_alive(id))
user_kill(id)
}
}
}
/*====================================================================================================
[Special FX]
Purpose: $$
Comment: $$
====================================================================================================*/
TerminatePlayer(id, mascot, team, Float:dmg) {
new orig[3], Float:morig[3], iMOrig[3]
get_user_origin(id, orig)
entity_get_vector(mascot,EV_VEC_origin,morig)
new x
for(x=0;x<3;x++)
iMOrig[x] = floatround(morig[x])
fakedamage(id,"Terminator",dmg,1)
new hp = get_user_health(id)
if(hp < 0)
increaseTeamXP(team, 25)
new loc = (team == 1 ? 100 : 140)
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(0)
write_coord(iMOrig[0]) //(start positionx)
write_coord(iMOrig[1]) //(start positiony)
write_coord(iMOrig[2] + loc) //(start positionz)
write_coord(orig[0]) //(end positionx)
write_coord(orig[1]) //(end positiony)
write_coord(orig[2]) //(end positionz)
write_short(g_fxBeamSprite) //(sprite index)
write_byte(0) //(starting frame)
write_byte(0) //(frame rate in 0.1's)
write_byte(7) //(life in 0.1's)
write_byte(120) //(line width in 0.1's)
write_byte(25) //(noise amplitude in 0.01's)
write_byte(250) //r
write_byte(0) //g
write_byte(0) //b
write_byte(220) //brightness
write_byte(1) //(scroll speed in 0.1's)
message_end()
}
glow(id, r, g, b, on) {
if(on == 1) {
set_rendering(id, kRenderFxGlowShell, r, g, b, kRenderNormal, 255)
entity_set_float(id, EV_FL_renderamt, 1.0)
}
else if(!on) {
set_rendering(id, kRenderFxNone, r, g, b, kRenderNormal, 255)
entity_set_float(id, EV_FL_renderamt, 1.0)
}
else if(on == 10) {
set_rendering(id, kRenderFxGlowShell, r, g, b, kRenderNormal, 255)
entity_set_float(id, EV_FL_renderamt, 1.0)
}
}
on_fire()
{
new rx, ry, rz, Float:forig[3], forigin[3], x
fire_delay = get_gametime()
rx = random_num(-5, 5)
ry = random_num(-5, 5)
rz = random_num(-5, 5)
entity_get_vector(aball, EV_VEC_origin, forig)
for(x=0;x<3;x++)
forigin[x] = floatround(forig[x])
message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
write_byte(17)
write_coord(forigin[0] + rx)
write_coord(forigin[1] + ry)
write_coord(forigin[2] + 10 + rz)
write_short(Burn_Sprite)
write_byte(7)
write_byte(235)
message_end()
}
beam() {
message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
write_byte(22) // TE_BEAMFOLLOW
write_short(aball) // ball
write_short(beamspr)// laserbeam
write_byte(BALL_BEAM_LIFE) // life
write_byte(BALL_BEAM_WIDTH) // width
write_byte(BALL_BEAM_RED) // R
write_byte(BALL_BEAM_GREEN) // G
write_byte(BALL_BEAM_BLUE) // B
write_byte(BALL_BEAM_ALPHA) // brightness
message_end()
}
flameWave(myorig[3]) {
message_begin(MSG_BROADCAST, SVC_TEMPENTITY, myorig)
write_byte( 21 )
write_coord(myorig[0])
write_coord(myorig[1])
write_coord(myorig[2] + 16)
write_coord(myorig[0])
write_coord(myorig[1])
write_coord(myorig[2] + 500)
write_short( fire )
write_byte( 0 ) // startframe
write_byte( 0 ) // framerate
write_byte( 15 ) // life 2
write_byte( 50 ) // width 16
write_byte( 10 ) // noise
write_byte( 255 ) // r
write_byte( 0 ) // g
write_byte( 0 ) // b
write_byte( 255 ) //brightness
write_byte( 1 / 10 ) // speed
message_end()
message_begin(MSG_BROADCAST,SVC_TEMPENTITY,myorig)
write_byte( 21 )
write_coord(myorig[0])
write_coord(myorig[1])
write_coord(myorig[2] + 16)
write_coord(myorig[0])
write_coord(myorig[1])
write_coord(myorig[2] + 500)
write_short( fire )
write_byte( 0 ) // startframe
write_byte( 0 ) // framerate
write_byte( 10 ) // life 2
write_byte( 70 ) // width 16
write_byte( 10 ) // noise
write_byte( 255 ) // r
write_byte( 50 ) // g
write_byte( 0 ) // b
write_byte( 200 ) //brightness
write_byte( 1 / 9 ) // speed
message_end()
message_begin(MSG_BROADCAST,SVC_TEMPENTITY,myorig)
write_byte( 21 )
write_coord(myorig[0])
write_coord(myorig[1])
write_coord(myorig[2] + 16)
write_coord(myorig[0])
write_coord(myorig[1])
write_coord(myorig[2] + 500)
write_short( fire )
write_byte( 0 ) // startframe
write_byte( 0 ) // framerate
write_byte( 10 ) // life 2
write_byte( 90 ) // width 16
write_byte( 10 ) // noise
write_byte( 255 ) // r
write_byte( 100 ) // g
write_byte( 0 ) // b
write_byte( 200 ) //brightness
write_byte( 1 / 8 ) // speed
message_end()
//Explosion2
message_begin( MSG_BROADCAST, SVC_TEMPENTITY)
write_byte( 12 )
write_coord(myorig[0])
write_coord(myorig[1])
write_coord(myorig[2])
write_byte( 80 ) // byte (scale in 0.1's) 188
write_byte( 10 ) // byte (framerate)
message_end()
//TE_Explosion
message_begin( MSG_BROADCAST, SVC_TEMPENTITY )
write_byte( 3 )
write_coord(myorig[0])
write_coord(myorig[1])
write_coord(myorig[2])
write_short( fire )
write_byte( 65 ) // byte (scale in 0.1's) 188
write_byte( 10 ) // byte (framerate)
write_byte( 0 ) // byte flags
message_end()
//Smoke
message_begin( MSG_BROADCAST,SVC_TEMPENTITY,myorig)
write_byte( 5 ) // 5
write_coord(myorig[0])
write_coord(myorig[1])
write_coord(myorig[2])
write_short( smoke )
write_byte( 50 ) // 2
write_byte( 10 ) // 10
message_end()
return PLUGIN_HANDLED
}
public touchtouch(player, player2){
if ((!(task_exists(player*1000+player2))) && (!(task_exists(player2*1000+player))))
{
new Float: speed[2][3]
new Float: over_speed[3]
set_task(0.2,"empty_space",player*1000+player2)
set_task(0.2,"empty_space",player2*1000+player)
entity_get_vector(player,EV_VEC_velocity,speed[0])
entity_get_vector(player2,EV_VEC_velocity,speed[1])
for(new i=0;i<3;i++){
over_speed[i]=speed[0][i]+speed[1][i]
speed[0][i]+=over_speed[i]*0.65
speed[1][i]-=over_speed[i]*0.65
}
entity_set_vector(player,EV_VEC_velocity,speed[0])
entity_set_vector(player2,EV_VEC_velocity,speed[1])
}
}
public empty_space(){}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1045\\ f0\\ fs16 \n\\ par }
*/
|