From a274f6f6bcc1e4561d5f56c5074a99418463dac3 Mon Sep 17 00:00:00 2001 From: Erik Minekus Date: Sun, 6 Mar 2016 20:33:00 +0100 Subject: [PATCH] Transitional syntax --- .gitignore | 3 + .travis.yml | 36 + README.md | 2 +- addons/sourcemod/plugins/.gitkeep | 0 addons/sourcemod/plugins/atac-beacon.smx | Bin 5215 -> 0 bytes addons/sourcemod/plugins/atac-blind.smx | Bin 4830 -> 0 bytes addons/sourcemod/plugins/atac-css.smx | Bin 8631 -> 0 bytes addons/sourcemod/plugins/atac-dods.smx | Bin 9469 -> 0 bytes addons/sourcemod/plugins/atac-drug.smx | Bin 5245 -> 0 bytes addons/sourcemod/plugins/atac-fire.smx | Bin 7339 -> 0 bytes addons/sourcemod/plugins/atac-freeze.smx | Bin 7857 -> 0 bytes addons/sourcemod/plugins/atac-ins.smx | Bin 8289 -> 0 bytes addons/sourcemod/plugins/atac-ircrelay.smx | Bin 7097 -> 0 bytes addons/sourcemod/plugins/atac-slap.smx | Bin 3362 -> 0 bytes addons/sourcemod/plugins/atac-slay.smx | Bin 3163 -> 0 bytes addons/sourcemod/plugins/atac-timebomb.smx | Bin 6977 -> 0 bytes addons/sourcemod/plugins/atac-uberslap.smx | Bin 5784 -> 0 bytes addons/sourcemod/plugins/atac.smx | Bin 15286 -> 0 bytes addons/sourcemod/scripting/atac-beacon.sp | 142 +- addons/sourcemod/scripting/atac-blind.sp | 109 +- addons/sourcemod/scripting/atac-css.sp | 374 +++--- addons/sourcemod/scripting/atac-dods.sp | 456 +++---- addons/sourcemod/scripting/atac-drug.sp | 136 +- addons/sourcemod/scripting/atac-fire.sp | 231 ++-- addons/sourcemod/scripting/atac-freeze.sp | 274 ++-- addons/sourcemod/scripting/atac-ins.sp | 328 ++--- addons/sourcemod/scripting/atac-ircrelay.sp | 470 ++++--- addons/sourcemod/scripting/atac-slap.sp | 64 +- addons/sourcemod/scripting/atac-slay.sp | 56 +- addons/sourcemod/scripting/atac-timebomb.sp | 177 ++- addons/sourcemod/scripting/atac-uberslap.sp | 192 +-- addons/sourcemod/scripting/atac.sp | 1175 +++++++++-------- addons/sourcemod/scripting/include/atac.inc | 77 +- .../sourcemod/scripting/include/loghelper.inc | 245 ++++ .../translations/atac-beacon.phrases.txt | 20 +- .../translations/atac-blind.phrases.txt | 20 +- .../translations/atac-css.phrases.txt | 56 +- .../translations/atac-dods.phrases.txt | 80 +- .../translations/atac-drug.phrases.txt | 20 +- .../translations/atac-fire.phrases.txt | 48 +- .../translations/atac-freeze.phrases.txt | 48 +- .../translations/atac-ins.phrases.txt | 32 +- .../translations/atac-ircrelay.phrases.txt | 164 +-- .../translations/atac-slap.phrases.txt | 28 +- .../translations/atac-slay.phrases.txt | 28 +- .../translations/atac-timebomb.phrases.txt | 30 +- .../translations/atac-uberslap.phrases.txt | 28 +- .../sourcemod/translations/atac.phrases.txt | 252 ++-- 48 files changed, 2856 insertions(+), 2545 deletions(-) create mode 100644 .gitignore create mode 100644 .travis.yml create mode 100644 addons/sourcemod/plugins/.gitkeep delete mode 100644 addons/sourcemod/plugins/atac-beacon.smx delete mode 100644 addons/sourcemod/plugins/atac-blind.smx delete mode 100644 addons/sourcemod/plugins/atac-css.smx delete mode 100644 addons/sourcemod/plugins/atac-dods.smx delete mode 100644 addons/sourcemod/plugins/atac-drug.smx delete mode 100644 addons/sourcemod/plugins/atac-fire.smx delete mode 100644 addons/sourcemod/plugins/atac-freeze.smx delete mode 100644 addons/sourcemod/plugins/atac-ins.smx delete mode 100644 addons/sourcemod/plugins/atac-ircrelay.smx delete mode 100644 addons/sourcemod/plugins/atac-slap.smx delete mode 100644 addons/sourcemod/plugins/atac-slay.smx delete mode 100644 addons/sourcemod/plugins/atac-timebomb.smx delete mode 100644 addons/sourcemod/plugins/atac-uberslap.smx delete mode 100644 addons/sourcemod/plugins/atac.smx create mode 100644 addons/sourcemod/scripting/include/loghelper.inc diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..63fc72b --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.idea/ +/addons/sourcemod/plugins/* +!addons/sourcemod/plugins/.gitkeep diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..7462ab3 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,36 @@ +sudo: false +language: c + +addons: + apt_packages: + - lib32stdc++6 + +env: + - SOURCEMOD=1.7 + - SOURCEMOD=1.8 + +before_script: + - mkdir build && cd build + - wget "http://www.sourcemod.net/latest.php?version=$SOURCEMOD&os=linux" -O sourcemod-$SOURCEMOD-linux.tar.gz + - tar -xzf sourcemod-$SOURCEMOD-linux.tar.gz + - cd addons/sourcemod/scripting + - chmod +x spcomp + - cp -R $TRAVIS_BUILD_DIR/addons/sourcemod/scripting/* . + - wget "https://github.com/GameConnect/IRCRelay/raw/master/addons/sourcemod/scripting/include/ircrelay.inc" -O include/ircrelay.inc + +script: ./compile.sh atac.sp atac-beacon.sp atac-blind.sp atac-css.sp atac-dods.sp atac-drug.sp atac-fire.sp atac-freeze.sp atac-ins.sp atac-ircrelay.sp atac-slap.sp atac-slay.sp atac-timebomb.sp atac-uberslap.sp + +before_deploy: + - cp -R compiled/* $TRAVIS_BUILD_DIR/addons/sourcemod/plugins/ + - cd $TRAVIS_BUILD_DIR + - tar -czf release.tar.gz addons/ + +deploy: + provider: releases + api_key: + secure: AV2KA95YZ9HLZExkSxZavQGptQMKUNwu6bgALbEor4Pevnbnvq+XjMemfRBKTz0NjRwtREKlllW0b6Ppj0iTx1a5BWTHjuK73n2oUOfKuhQDc1N5ycnoT38hzqlk3s5u870YOTzxCVrzGfnw+ujs+hVBmdyuSmHr2yWPkIN9DJ8= + file: release.tar.gz + skip_cleanup: true + on: + tags: true + condition: $SOURCEMOD = 1.7 diff --git a/README.md b/README.md index 0c9f892..92f88db 100644 --- a/README.md +++ b/README.md @@ -1 +1 @@ -Advanced Team Attack Control for SourceMod \ No newline at end of file +Advanced Team Attack Control for SourceMod diff --git a/addons/sourcemod/plugins/.gitkeep b/addons/sourcemod/plugins/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/addons/sourcemod/plugins/atac-beacon.smx b/addons/sourcemod/plugins/atac-beacon.smx deleted file mode 100644 index 89aca9df16470ac4071f627859acd5db6128f570..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5215 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 diff --git a/addons/sourcemod/plugins/atac-blind.smx b/addons/sourcemod/plugins/atac-blind.smx deleted file mode 100644 index c180d03cfcfa0e0367f718d0bac69893c511ee27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4830 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 diff --git a/addons/sourcemod/plugins/atac-dods.smx b/addons/sourcemod/plugins/atac-dods.smx deleted file mode 100644 index a389d5f156b92950f3afcb89c8a3bc26b999ac1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9469 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 KjN*%D_WuvKj;}rd diff --git a/addons/sourcemod/plugins/atac-drug.smx b/addons/sourcemod/plugins/atac-drug.smx deleted file mode 100644 index cc6d7f0f343aa34f71673177d5fe51ee68bc83d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5245 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 diff --git a/addons/sourcemod/plugins/atac-fire.smx b/addons/sourcemod/plugins/atac-fire.smx deleted file mode 100644 index eaf6f55c1045907548c1b142752cd09c714d2206..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7339 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 diff --git a/addons/sourcemod/plugins/atac-freeze.smx b/addons/sourcemod/plugins/atac-freeze.smx deleted file mode 100644 index d4aacb93fb77c21ed3db4ae58ad5e186ba1a9965..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7857 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 diff --git a/addons/sourcemod/plugins/atac-ircrelay.smx b/addons/sourcemod/plugins/atac-ircrelay.smx deleted file mode 100644 index d03eaf58cfa6c4b8e99616166605e0914e735090..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7097 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 YyvpR@?Eib7)Dc~dOx}ZDX3JLm5ATJQ2><{9 diff --git a/addons/sourcemod/plugins/atac-slap.smx b/addons/sourcemod/plugins/atac-slap.smx deleted file mode 100644 index 03ffd72ed4bd12fc639aca318cd137d5f5c397c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3362 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 Dmy%?O diff --git a/addons/sourcemod/plugins/atac-slay.smx b/addons/sourcemod/plugins/atac-slay.smx deleted file mode 100644 index 67c072eeee16200ea16bce7d2a0068c88dcd06c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3163 zcmYL@cRbbmAIHBZam;X!5yI`-*)#i4A$uI7jEZ9&9P`)?imbA8tQ$g*XQ+ozdx_{`}5J)w}71kfgG3tV3!vFSg-&9$bzWHzix3J z0O+V3Lkj>(=Kz430~){pAWn5osurlMLv;bF_~-#ZmFi+t!Klne0|3%ghBE=cz+dxJ zmShKjaq50uDj)s!&mI#h{{f-qseL;tD{ugSE%hx|DkpJK`&9R(Dv!#J)c?r9{aoDu z8CPeNGa%z1?Bauf2mK8p&Vf|$bw(jV+^B$Z_V~L*{#CfTc>Mq7ufiSS^IzWw;rky3 zg(F@3eE!WNeBJ&2nG8Y&B7CXa!sZ)qc|R7m;p|YJ9`@$G6>Jxtq?DdXyR^AM)>Sa|Cj+OSetF4;W*O>Eu(lau8xmZNqTLdhlOQ0MO zIo`wiRVQluj>96n+qR@alT2^vzW*hIj0{Np7w(xlKX}+^GSa6z80MlUeP^a&+8OF%3UP zIrBt)Ey$d&_)7;tc~e5+YV9wZIXnIB7Uf;NRo9y7y-ozn>2vSx*N$<}nZCQ;{GFUF zu-2o_%O@Y__vYdATeMH>m}4}a8jP>65+u=tH|oJi4S4?cL$nH-Tojua0K9isjmV!E?7;7kONmlG9vx3vq;#&~ufP_t zaO<7^O^lY5!j#wo{EIDLQ2SKtVfk#T7IEZeI_?J1bk5_LcZ{rlCjHG$JP++N?v#Ig zap(B^LJ0A=37N=#ut!;Mb+;p!i5$UPXbPtWJMW9n#B=I`v2Sb9>1K(Ig(@yiCLo5L zid}vd=uEd=72yY6sr@KRyFAn|_ys)cr5@9fu*zA4yitHZmO~Geo*R~Eb%nJ1TZ{Uh z(zozA#mvHYoFaL~US#dHqK?a}d$~to_qvJ9I^M?FN9v}({LR)+9|#1m7D!TH5oxxZ z+`P|74n1St7IqUj2mhXw{Wl_%nK!>AFk#}4`jyho z@s`Pk+N6#7Xq#@den0H%>s!3^&d%h(@rC?yE&hvB$&^C$4#O}x*!w|#(B2{56!qbG zVhFj9wp=f;B`^bncJLEfFdh=_*q7@>qVx{_BzJ-C{1KwNf1pIX#Cg^R`MNQnA_e!$ z*2ybWr;lQ|MSBXt*NvcCAwM+_z1b?Puo=fXtPeUEk1l`XnUK}#1h>oh^&&C|%TdSdMyn?6W&9E(D3tA6z5OjFs^MvSA)Fvp}?Xt$!8@pmIM%($g~}-6t%L3?=may+lHZA;N_{F zgSk0YP4G9+IPEe>leL*yQ!wo6c3jsuNEV2u{dsxiZ7lb>Vug=OQ^xNz!rd?aE_==~3G`Ion*wrrX`;aaINbLS=cYMci3}~78 zgxjC-1a{9yZ))5g=jW)#vq1PurrR_?17S@5F8s%yq%QTe{7WpF^p5A38QUOX zeA|j$=769*F2Lr{dqZ_UsDmj!a!8woj9a?1qox?uF4iL-qY|>}rs}x3Hdx1|L_A?j zQ!|?$VQwQaw*&+_L!PehqX<$%G@uPF8beQx!TQ0xxx7{ub3Ogw`gbf#$2 zbOV7sLsGu6m;%=*CAIW=iaor|SQ&ch!lIgT^3z@m7A6%*7>kLTRkiNq+8drf(s=jS z$5Bf7yDz^9f6C9(Sg|Dr-+zomIkS0{Mkn(wYCX@^&nT^1VAT@v@xLnddx{}nUm?y2 z`|!5r8YC zwK_+HWB$Y=J!!Fr>o4vUg~TNg8C~ZWDi-_Xq4E9fl=G8+l$QF>r-mA&P8d&(vhc57 zyO9``T2~<;#a%{6Hj8g=Y{7;(mk=%EfcXG$w;H9J-ADKL7LT)6zh>M+vpDaV>qRw<-OeN zCpDFF3DU{!R#DtNY){Td^dKg`v6064l=?o2 zOy4bhF6r=v#WdqOy-E0xazDeF<@=Tods&>Agj-!NULmH3l1x-SLpM3w4R|2!ns$*4ztA!Dt0 znjPtICHp;rs6v;>c;a0l$FW<7Ps3ca3w^a)>N{)9r83lWOSBdGJ0d}{Ofg9Jd#rgu z{fK9x#!Shk-`IBxv9sYUL8vGboS1F;Nw6_~_TXlQ0mEnmr4U^&a=o57{6@<6=z4Xs zRr~CG?!oMs+ew)kd_yQ9f5#fK9w2VW>zeOl++RA*)h^0xt(NKBj7jK**Mtd->P{JB;DNt8en3eq;(jY+<}6LfTg(7H2sVJ=XcM?r6PI zb+j;#T`%!VIl6wx49gwAKynaec?aAyYMW3vZllN2q8JA1M?4Uqt+aW=lL%IBJ0a4v(>G+fl$#{6c)X$pg7c={9VKjogioJSO5 zRpg#kR28zp+!RG0;(NU`uO!RNZDk;_*@yted)yS_BvSPy1!K#HZkB&Z|J+Dv9@%u* zmTf7UfwuY#>@y$WXLu=j!s<%)jmq-@n+N)=dNmbyM|}&b*9;6HA{JA!h`oh@v))hz zcTVG`waLNu1>cIhrZTsWEf*Gr8lV{3=s}g2b_pJ0GEOZx3Q-T=zv1N;sxaC~$0^8~h_6qQjy)F2qc?7MvQ0|fEW_X!N2~f6b`L9&tguJP#AyqJw{OV zQ`j#jo`_|Zs{41Hf|tN-#4p@sKP{{bII_QhgQxX+8#@OFvpWcb!Y98rmh$d>g~P12 z-hrc(e`ftOjf6-Viw+dv%N&azNh{r>N4z|5 z{N4}Oef{q^_cFaQ9qC;s&Y0C2+w00f^{niT-}{Im!3 z#68>qfcldwKZ%$J00?>p0O&q(f&c)}_Z$GQd}6Q!0Py0;ot|X%#EMT3;I@ESS^>B% z&D_iY+@IXd9qlY!{~J8aT%N$m%+1cj>IvM;Z2mii{wJ|CxB36he-dju$N#H4+By9n zx_U#+VUGVhZ|7tU`=67pZZ39CPusi}55)t&8Ctm?kNKi3F6C<#g5Km*##00^EsT8* z;)`E6h-0!6(ep@QdM=9e*g8BC5I_!GtvGscu_wRzf{RT?COD{B6G^KIAF``qk+)D| zkIcblV{fR*RUzY8RL~+qKzsuIVJjJ#3w@2dCd;m!EyrzFDDN)R@^Qdw2Wsf0ia=uP zCDom~ZMtyT=_-{1im4*>Td-To?7%>RJEJprpa^KMa_>=7fku;?-YNyJ zQ{^Ol@=Cpa4s<^btN*Z9Rtx7JZvrXJ71!Zv;vzt&xTrStX&d*#SM(Lwt@JNY zk^no5{L>FsqYAwb>G^OG8LCnctWrPYgQZid^s`-6N|IzX+^S326UfnNsfU4OmgptQ zJu8I`DXwh;-ygg0=_}cmGUt@I8XHK!I&gIP}T)~hJA?9rDjfvl;_M;2;QuTK3MwH7h$3UUWNSVT!b}T zE-0yjf4iRe_?!7kmo_`7q$c71)v zc71M6BgHC3BaNB;qUA+4@FgCyM4*N@yLEpui8}vf!(h>M^9||wDe&CM3WoTR7h}R^ zQ$uA_G9U_Wp{a%C{tMCi2CHP3_KiA&g8#wFdYc?V1AJ+2eR2Yev5Yc_u2@vngw>er zmsScjUU%ga26)rl-Lm^tIQtovUD!7Z4TQvJU(rx9U4wWxcE8I75XHMSN?`L7VH$XZJ22||T5>0*6@ ze8~pDVL!Wm$BpSiB0&Q*^1`P-7C2>GgW1N|I23JeGE;m1X*qoz-9osQutjTRvw7u3 z4Vs$H!pW3NCUIMpE7}b-LExUjF3*RP<1JlBc8A7dCAY85hiz_{r9q2MM#a~v0Y;M) z!LzhjKh9mlt>#gZo4fWNzkz_QHy2T(+^_sghHs5H{Y|(JkE6>I(tlxp$POx;|CCa1 zmNn1;S)gtn(9Nl+5mhzO2nk4>r+^d-)utqSXdjVTC&he^_g-aNoswE1O;`@QemO*4 zQzbv110Cdi(_NNS9rDjY!Kyt zpyH}Bl^S%)GF>fl$;6I~*~Rr5T(48)Ec1+Z_S%iO&nB6DyU4rZK~w&D*CGGn()awl zdEJQu9U+{lL{YSInd7ZKu5`B9E3A);1#tz#&8oUKLv?T@N@CpKsk^ayLQU$^LwK^l z-4>}3Yyxrzs`tpRAEZV(+HwIO%tnM^Z5E^z=iteoH?EjM=>I>l(S z^@S9!jn5+|&zpX3y8#15D}}Uldcx1b+=P$ei~ZE~r1!LSA;IQr&s@JByCN&+^xQ&J zyA0V|j7_(JEL*@3yTN15=IS39bp`GF;@m4Byj@E1wlUYj?;B&wO-cb}`())3ey<{y zzh|zZSBz^e4A+z=u}GmoCqvBO`k>Sa1FcTKIDN5*)G#PSOO}OoJKxa5hhonwHi<5q zgV-q#N+y@NF%!8@iXl`e)kZNX!Gi4e=7}fglU5(?UyO^ZXB1HSW#9jYGG}BWh3FOSvZADN43dD0g2;?)!y-?f{)6l*;cJ#MPLv(BM2N4cff68u*9`bS-B;;UUOg%_E51~tn<_6 z;!9(^Ns`?2ym>o;C)-lq50xFa=* zI2X)^{c5}ElDVZ>#Q5=PTpp#g?YqI7kDm{iJ_L5P_>)c-(M#g*M#p#J?%FBvyt}ng z=nA*|2{BGtYbr>J7iOA2cEe-B)})-K!3h|=mdNi4I#-#p(WNTCs^p*F^5s~{N+ZC^ zyk|RK?-t8iw2r6aYFPduuEq|1ajcn$wIEc|4!YE{AAi$E-!S;*HNATrNLY8z0_%oO zGthjJMiLnb@{r&AbvKX&w4Ge?-^;-2$hOH67_uI^%L5&kmsntR+!O@Z#dD?KR)F@? z?S*%<;(>$tS1~hT%nKtWWXv5}`IWr8&^HZJ`M!SkWr|l@GlYoU8*6qgd1S@KHyOqgL0zeSSbFk zDB#b#tLRZ4fYY<<46ItH7D4s=ef%*%G-&gg=<^fJpbWrUjgDBr~&AEvNpPIF_*5FszNd`skh4&|i?yM#QT6pwUc2j&8ue$M4upaNM zUutV+L+x*2%4RdCQ7)N@pCy8dP@w~ z%jbVyeTrOs*MsAOM-sUe9J6uUj8_-p9Rc=X@$1xHdsincBCg|6OPD&#$-&NN84)b#>(M?8ggPjRl1nDV02dQ7YZ{wz^2f#Q zV=M>%!I(94wJ7WPQUnA4X9n+k{3vz=vf%-q*Jv`1eNsa#j4g!dB5q9HrxzJ;qM#aN zQx2l9g7?6kGvu$7u5)v*gQ<;{=mIXarF>C?zLFE4t;13IudlyK3j9e4pSl)?CGz53 zaf~=Nc*ZT%YQ_^ZF<4`LdZlZdhd81ydQKhj+IwZWqUJg5!zr@i^++SO{qXX?`A-+z z|F++Wf{yZEXv|Kwr**z3#6b@tj4Bkh+RiNiMRXf87~bJZ^I|ZBMk`1Vxh}#@X^2o- zR7@inp(?%gW^E8!ye(6)(~p)3@e)dRmc+>VLnqU+;{e|LWj1~E$%^1!`|nzA)h_eIczeq^^tC zbi&RRCim`?95h)F5@qmgQ(JSWwD)iQF@f-$0#76%ROa9Qia0whKMsA?}p?D3OgFKi=`pae@{X`Cn zrD-dJ#yT_EY*7P49r^BEauXzuG$4fiuFz|J7ASpGF;yeU_FXd!`(mEAaqlj-Rcrf7 zihXm3?}7BEqxo|>XE$RIwCT3HjBo{Ugz$DRK@@Gm{g_8LFp%4}F$_$BWM5BckPd>5 z-J8@8ssyOEQ$#0Sc7L4PC0cv_udimyBtUGEd$~Byj;u(qqq0Is^m~bchwq7z%J~As z7RP7Ly22_Icn6C!oxFplD+h@34U2g1aT3b7a0o?P_~4*D_F4%TMs>ZXwB;O&u;!ISlGqyOU_|<(t|QD?ERM5mpsXLM4IX4sgZx z!+^ATpNF8a_Y~%xM=7_}*(rZk&(XXmWkScD6r*r-NBHOwqnt7mZM;pWn%v+Cq=37$ zxJz(;)<NVtkjyYGbsrfXH4}c@;Y-VTQ4(wdrLZk zR3`4SDvY^-7dFq0Mhg21tcEpQSX=Unq%uf|tGtyUO|h)S4gv>Lk_hl{Dsqh$tFBf^ z9r0Q@U$KoY<03UW109G``Ncm-jixvsPVIDe7Ghn(tHs@-B%pHIr$ow#i9zMd7sgB7 zJp9?VrV~gGf;;`zii8eEuaB~@F+G)ov4!P69)-d5>oB_?X-PXWxk(So?Qo*#lucKv zW#b02yDkqwycmA(srekNcfNZpX05H6Oq6{#iHtdivX%R4fKHU>?V>+XCR(O{PVZjMUib+-kC=uOthAld`z93|rJt@aimFno#^ z@Q6A0YHfl~vmhVHde7NyV(uUG80E`7ypO=CCRr0wG;YcS@ceXFIlEoX{(Ire zFuZ?-{!XIT1he_&%`=alw-CCuf+tx)y24DTjfe8x;-!8DX8!ux>-kfwxPL%d7et7Vp5<@-Ebl zo5fMDmge`p%HetF=}TfG4&b&AsK(#XDakM!JQz&8!^;kP@h0i=)Wc_C+Sq=3NIj+& zv`GYwg3muPoFce$U$GxH%AWHVROl=7XzB;>bpZlB_%g!cIJY_${`44|#*8#msvQyf zXiVRV@4QvS173FtI31h9W`YSXmCf9qwU%9e@Av!3iv9Q3a9t>mDfmYjGe&jLJ-S=J zTep8Z>6&=Weci(5MNXZV3kIX`B#rx>V=S&M7W`g*hY$1G$&qNySA9IWdM-DF^w9WA zM7P$S*_6^4-$CA3>4BM8=?fGDA{^zFUkNPH2q8u z3dqr;!G|JkrJvhT>`zo}G)00=Hmx7x09tJXE@ItOK~i!;t-Xlqw=oIbhydf+McVFT zQj3kGYM~gZQHno{UrL{P5_r`OtKk(ixjsAKUL@N7+piHZxf8#)feo4->BrYg7v!BirE;dHX>n8p4?4z>zp2Gm&uS z8yariUCOkiA`xX%kXiQCk$j-0xFUJ9xAG&q_ZRaymRbC~`Teidv)xxLGmVin@!oaD z19jwL4Qzi&Cy>RH)dP+BUk9Epd7bEIXNfNt_~vqpX}@smMRbK4OM^naZ+m!#r3F`P zCY~5s{|c=Odz63Ir&6)-4w1jwq^Q#oLx#;Ix>%Ux>^q64kJe@nlf$s+;3@-VS zw_u4Z!&th75bej(j~=AHynl5`QFDs@C9Idj@md-OO){#oHS+%n(l}4sACyGN2D9+R z$TH1pWu5nA7qhE=F2tMkq3ZHv6{U_H&Pj9UUhHQsz3kB9rL3`s(q@9oxRn zim-+N*dydmM2{fWxpiZ8ds?4BI^IgB!OVTQ6{`|T zPE_r01-T0a%BwQWzxFPgwC|xf?9k>x7T4Uw$?U!&to2pRmQ=@*SRg~c<%3lq!zDsz%SxtMzi(gX@>SDIBC^Mo z-y_olUA|UEmkqUQEnx9ax&;R^6$fVHebsRdXI|Hy9iOldYgE16O26H!au|$5wN=dm z=SQZT_3=@f9D}9(HC;|%;sD%ehjd3R;HFhw>p%@@8nek}AQStu6Jd&750ks<25;M2^dMc2t>vEqe zqiU}d?ETQfe&*+yndw>!8D+@=`+VOX2w~92;nxqU>gac&mt23=ne17oBXy{%ddmy< zuI#MVB**Qe=udlr#8T~r?Ytaa2zVzgqdu}NvKyK4=_Q5{L+ATb(cvIH za=&e(YKgz@YlEZ4I6_||2HmSW`iSqE`aQaiz!mwj2(JTzm=Fj z;Ch)49>*S~Nwr6~DolfZ@O45L&muB&b%H{(5u9g^og#_XG@f>v`_5g~!2ut$2zp1r z-eUf@;Cihgdm|fG_jK?>MXG~#eiBppqKeW`YL(zVxtUC#VId)|RJBG1=c_t>!dKtD zNv{f&q=k%1-}m|pPqZn?$VVw?tYo2CI}-_TSC8S;{$^m{Q{$|1BnT`&$I8|GCB!kq zeQteYv>8B&wdQuw))w829`Gt!oO8h*zrDlWy=TNjuZ3DpIxL@?IAudSMQe2HmsneL zE`%Q0wZh9bFECxJ7P~1heO{lGJu04P6VAxVYE!){Xdhco*Sui#khb35eEU1th&2cI zu4~sSn5~0A+jY)qZs}i2dHJE|MV-%|9A2YhplXp;)Q%(xO( zzMnbq!%g#b^y{ zlF*?VV(OI;GRZNu`4Txsk09+kOju2QKYhaqQWLVI zqSIFJu6s)OP^JFRuiPP@DKkfCKYs4-=Z#{^skQ7{RU+AORN<)=7unA#J`0?vl9Kbe z3>a}LrTs9B!hYm%{AWVChgHi(@moj4vRJj+;BB%kyX08Hw3Z$Aps<|TXe!>IHVArl hAeO~ssqV$jBxD|%y2^L>10H7e)^N8Az%3%>{$EVpcGLg> diff --git a/addons/sourcemod/plugins/atac-uberslap.smx b/addons/sourcemod/plugins/atac-uberslap.smx deleted file mode 100644 index 9c602065e77dd6a475a6c85cff16be83489f8fa7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5784 zcmYMuWmweFvjE`VvV@c%-Hk{s(%sS}Al=;{-AjYg(v3(;2ur6dNQ1OUhk&#!-OJ^F zg>)`x<_s$Nk|3^=M7fUzi|Lu2h zwRQWSNlz~i2iK=UG@i)UNJ!f7hCILmyT*1mu+X2Ga_E;MI?G_I9f) zUa7P{(|SJLB@-8gFa_VQ;3ATK^{lb`->*FT+EMnXLf51utTWxx3$NcUHvPfNkL^K-|&l)VQ~8`nyJY>sAWR{{AcYMy94w=of<50+paH zlU-lF&u&DwVBB458A&S9h8vOka4Iu>Y4t&hNpP1Vyqv52N;i3Ck9cdg62euE>-gY* zdSPw_Zs!{Ohkh<$mb5?Vu4cx3u(V@U^1Kk*_F&1#gI$Y zq??1(G0AOXfbH!?iebn^a03YW27GS`4ssHUb?Y1C)%s_}f02X*RU5jLOt!tHSFG(L zUyBf#GVXqmoqjx+*3BJ4T@s^8$}p(b{`)b9=YUXURE(M};@&x($BvURq}v(t!eqvs zd_tu{kjJ(*`{4TMT4HeNk0%|pVVCuvdoGM%;5SNQKuaV?q~5u?kQpY=OYSG(`q z%w8Zxtc;Mh+y`VksZyG*7GYMu>C9*|FLh7ZgG2fXi*Y%P2X?AD)bqXR#UU+k91f!9*bs)S zGX$skog{y;54xx8XIJl>ikkQg)wbd&5~gje! zg|%_prig@!SW&P6-F|q;_vbBrPN^wnmE;@B+Q$^H^*wZvP=)kuuk{POA}}-r?Dsbu2~9lE8=)q+ z!z5{bv|LEN7w%RZh&o~-7;Onr9Kc#VX%0AIxcNYa#tI`w0q_$@3-D8dahr^255UeE!owD$fxP>F<1wq&QA?U(Lq|T|5|S zjrvF@qp7>>;}2+plPC&Yn>5nA?FMx2eFhF4p_3*5qW_L&9Od}1F8=;3(;>I zI_c7ps*h46L@ss?)6YXR$O`N-%C?sB_&egxmc6aYgDDStmB*ng#v=%)d=>>; zj>XM|2s2Dw@rZSrBl6G>wT6deyLzilM<}B%aa7dSJ^1}E1zpWbZeD1=nLt@aIpnU~~V-3Au-*j-NIbcSIX8Ql>QQ z#x2>Xs>>X>{$}E6a$c=xk17~n_(ICMnL$0ny9}w#69+ndeedKlT*~#Z_WHpupB0ZH zet#HU2>;Yo>8W0bd)9irf#dLF1^R~y*m=75)cGIwk&2~h-c=c{^t?BnWkzB`+@@aprt7hfzb(i0i z?Zj}edK;$9KFnmZwy>!OD*oGa7a?@0ID7wX5)z;KSY$#|elyi5bn|D?J}=18#Vs#L z^k`1#$YBu⪚4()@#A{DDX27Qa$glR3Ozl%jd${LDuoF514T53of*480w8;n02 zddgLKaP}hj*`Rel1ooA???2RDc z8g@(zz9$OmPNg#$dk}>?0Z6^@aaluc!v2^hezlUpMPcAB>^tVVK&ZIdmX*VAfGYBs z8i+~O2>k(ghc1EC1*cYP(n0@F{qWb_P{d~6e2>0-27fV&7g`JyqP0@4`{vlM*em4P zyKI@F`H90@fJ88o1z=gfD_8S^jOC-Zk|NySeh)?j`=tC4U%Ua_06&M6AmXD~rWH>6 z2fz(o2!tRB6$D2f>G6VA(I=IrA7uYED7BkS(Wp)%XOMm=mtQW+fy)T$%Ee=6^VrKY z`7v&nhGI?>k9&#Xr0747H~T750!iDA;w5p`d6Xdm-_u_halJjrNbGEn9dfXzX;vc@;XVz3F4AEzUgy-YPi7-vhXMy~zncOt zLcyj*($mq>Nd~v!8|OxJeCJFC=%P3)D6}X$VSDoytLyh~`p0sk-tHm6-&$j22!Ke(kiyR~@d3@}%Ss#UC$s<)7U}qw@p~$ewW+tm%Cn=iRck`4@}*GLf~4DwHAC z)bMRId#PBgMmB=VL+;wi4iv!Og=RC>>%X(7ixMm=nJuX(FMGEBpoJj{Cr2;zP{j~T z5bG`SXVf5{s|Kyqr&-MKJX0V~W*UDnds2oOhs9^9aa4CiKIe!qi+$-|GD1W45&Wk( z969KR*1l}O(Tfv+y&P$!HzJB{{K+Cj!mSl@@n#V4AUGn&sqgyb{Agab=I&*0 z>m}75ww$~fS|Ixpd$|?8Hhi5h$l!L~WlW8XM;p;Lsy|

wXUSv5=G+eAVZbFxsL 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 diff --git a/addons/sourcemod/plugins/atac.smx b/addons/sourcemod/plugins/atac.smx deleted file mode 100644 index d546bb008e207878303512b0465e13937d927699..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15286 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 diff --git a/addons/sourcemod/scripting/atac-beacon.sp b/addons/sourcemod/scripting/atac-beacon.sp index ed461c2..aaa8167 100644 --- a/addons/sourcemod/scripting/atac-beacon.sp +++ b/addons/sourcemod/scripting/atac-beacon.sp @@ -1,110 +1,112 @@ -#pragma semicolon 1 - #include #include - #undef REQUIRE_PLUGIN #include +#pragma newdecls required +#pragma semicolon 1 + #define SOUND_BLIP "buttons/blip1.wav" -public Plugin:myinfo = +public Plugin myinfo = { - name = "ATAC - Beacon Punishment", - author = "GameConnect", - description = "Advanced Team Attack Control", - version = ATAC_VERSION, - url = "http://www.gameconnect.net" + name = "ATAC - Beacon Punishment", + author = "GameConnect", + description = "Advanced Team Attack Control", + version = ATAC_VERSION, + url = "http://www.gameconnect.net" }; /** * Globals */ -new g_iBeamSprite; -new g_iBlueColor[4] = { 75, 75, 255, 255}; -new g_iGreenColor[4] = { 75, 255, 75, 255}; -new g_iGreyColor[4] = {128, 128, 128, 255}; -new g_iHaloSprite; -new g_iRedColor[4] = {255, 75, 75, 255}; -new Handle:g_hRadius; +int g_iBeamSprite; +int g_iBlueColor[4] = { 75, 75, 255, 255}; +int g_iGreenColor[4] = { 75, 255, 75, 255}; +int g_iGreyColor[4] = {128, 128, 128, 255}; +int g_iHaloSprite; +int g_iRedColor[4] = {255, 75, 75, 255}; +ConVar g_hRadius; /** * Plugin Forwards */ -public OnPluginStart() +public void OnPluginStart() { - // Create convars - g_hRadius = CreateConVar("atac_beacon_radius", "375", "ATAC Beacon Radius", FCVAR_PLUGIN); - - // Load translations - LoadTranslations("atac-beacon.phrases"); - - if(LibraryExists("atac")) - OnLibraryAdded("atac"); + // Create convars + g_hRadius = CreateConVar("atac_beacon_radius", "375", "ATAC Beacon Radius"); + + // Load translations + LoadTranslations("atac-beacon.phrases"); + + if (LibraryExists("atac")) { + OnLibraryAdded("atac"); + } } -public OnMapStart() +public void OnMapStart() { - g_iBeamSprite = PrecacheModel("materials/sprites/laser.vmt"); - g_iHaloSprite = PrecacheModel("materials/sprites/halo01.vmt"); - - PrecacheSound(SOUND_BLIP, true); + g_iBeamSprite = PrecacheModel("materials/sprites/laser.vmt"); + g_iHaloSprite = PrecacheModel("materials/sprites/halo01.vmt"); + + PrecacheSound(SOUND_BLIP, true); } -public OnLibraryAdded(const String:name[]) +public void OnLibraryAdded(const char[] name) { - if(!StrEqual(name, "atac")) - return; - - decl String:sName[32]; - Format(sName, sizeof(sName), "%T", "Beacon", LANG_SERVER); - ATAC_RegisterPunishment(sName, AtacPunishment_Beacon); + if (!StrEqual(name, "atac")) { + return; + } + + char sName[32]; + Format(sName, sizeof(sName), "%T", "Beacon", LANG_SERVER); + ATAC_RegisterPunishment(sName, AtacPunishment_Beacon); } /** * ATAC Punishments */ -public AtacPunishment_Beacon(victim, attacker) +public void AtacPunishment_Beacon(int victim, int attacker) { - PrintToChatAll("%c[ATAC]%c %t", CLR_GREEN, CLR_DEFAULT, "Beaconed", attacker, ATAC_GetInfo(attacker, AtacInfo_Kills), ATAC_GetSetting(AtacSetting_KillsLimit)); - - CreateTimer(1.0, Timer_Beacon, attacker, TIMER_REPEAT); + PrintToChatAll("%c[ATAC]%c %t", CLR_GREEN, CLR_DEFAULT, "Beaconed", attacker, ATAC_GetInfo(attacker, AtacInfo_Kills), ATAC_GetSetting(AtacSetting_KillsLimit)); + + CreateTimer(1.0, Timer_Beacon, attacker, TIMER_REPEAT); } /** * Timers */ -public Action:Timer_Beacon(Handle:timer, any:client) +public Action Timer_Beacon(Handle timer, any client) { - if(!IsClientInGame(client) || !IsPlayerAlive(client)) - return Plugin_Stop; - - decl Float:flPos[3]; - GetClientAbsOrigin(client, flPos); - flPos[2] += 10; - - new Float:flRadius = GetConVarFloat(g_hRadius); - TE_SetupBeamRingPoint(flPos, 10.0, flRadius, g_iBeamSprite, g_iHaloSprite, 0, 15, 0.5, 5.0, 0.0, g_iGreyColor, 10, 0); - TE_SendToAll(); - - switch(GetClientTeam(client)) - { - case 2: - TE_SetupBeamRingPoint(flPos, 10.0, flRadius, g_iBeamSprite, g_iHaloSprite, 0, 10, 0.6, 10.0, 0.5, g_iRedColor, 10, 0); - case 3: - TE_SetupBeamRingPoint(flPos, 10.0, flRadius, g_iBeamSprite, g_iHaloSprite, 0, 10, 0.6, 10.0, 0.5, g_iBlueColor, 10, 0); - default: - TE_SetupBeamRingPoint(flPos, 10.0, flRadius, g_iBeamSprite, g_iHaloSprite, 0, 10, 0.6, 10.0, 0.5, g_iGreenColor, 10, 0); - } - - TE_SendToAll(); - - GetClientEyePosition(client, flPos); - EmitAmbientSound(SOUND_BLIP, flPos, client, SNDLEVEL_RAIDSIREN); - - return Plugin_Continue; -} \ No newline at end of file + if (!IsClientInGame(client) || !IsPlayerAlive(client)) { + return Plugin_Stop; + } + + float flPos[3]; + GetClientAbsOrigin(client, flPos); + flPos[2] += 10; + + float flRadius = g_hRadius.FloatValue; + TE_SetupBeamRingPoint(flPos, 10.0, flRadius, g_iBeamSprite, g_iHaloSprite, 0, 15, 0.5, 5.0, 0.0, g_iGreyColor, 10, 0); + TE_SendToAll(); + + switch (GetClientTeam(client)) { + case 2: + TE_SetupBeamRingPoint(flPos, 10.0, flRadius, g_iBeamSprite, g_iHaloSprite, 0, 10, 0.6, 10.0, 0.5, g_iRedColor, 10, 0); + case 3: + TE_SetupBeamRingPoint(flPos, 10.0, flRadius, g_iBeamSprite, g_iHaloSprite, 0, 10, 0.6, 10.0, 0.5, g_iBlueColor, 10, 0); + default: + TE_SetupBeamRingPoint(flPos, 10.0, flRadius, g_iBeamSprite, g_iHaloSprite, 0, 10, 0.6, 10.0, 0.5, g_iGreenColor, 10, 0); + } + + TE_SendToAll(); + + GetClientEyePosition(client, flPos); + EmitAmbientSound(SOUND_BLIP, flPos, client, SNDLEVEL_RAIDSIREN); + + return Plugin_Continue; +} diff --git a/addons/sourcemod/scripting/atac-blind.sp b/addons/sourcemod/scripting/atac-blind.sp index e884e44..110a847 100644 --- a/addons/sourcemod/scripting/atac-blind.sp +++ b/addons/sourcemod/scripting/atac-blind.sp @@ -1,83 +1,82 @@ -#pragma semicolon 1 - #include #include - #undef REQUIRE_PLUGIN #include -public Plugin:myinfo = +#pragma newdecls required +#pragma semicolon 1 + +public Plugin myinfo = { - name = "ATAC - Blind Punishment", - author = "GameConnect", - description = "Advanced Team Attack Control", - version = ATAC_VERSION, - url = "http://www.gameconnect.net" + name = "ATAC - Blind Punishment", + author = "GameConnect", + description = "Advanced Team Attack Control", + version = ATAC_VERSION, + url = "http://www.gameconnect.net" }; /** * Globals */ -new Handle:g_hAmount; +ConVar g_hAmount; /** * Plugin Forwards */ -public OnPluginStart() +public void OnPluginStart() { - // Create convars - g_hAmount = CreateConVar("atac_blind_amount", "255", "ATAC Blind Amount", FCVAR_PLUGIN); - - // Load translations - LoadTranslations("atac-blind.phrases"); - - if(LibraryExists("atac")) - OnLibraryAdded("atac"); + // Create convars + g_hAmount = CreateConVar("atac_blind_amount", "255", "ATAC Blind Amount"); + + // Load translations + LoadTranslations("atac-blind.phrases"); + + if (LibraryExists("atac")) { + OnLibraryAdded("atac"); + } } -public OnLibraryAdded(const String:name[]) +public void OnLibraryAdded(const char[] name) { - if(!StrEqual(name, "atac")) - return; - - decl String:sName[32]; - Format(sName, sizeof(sName), "%T", "Blind", LANG_SERVER); - ATAC_RegisterPunishment(sName, AtacPunishment_Blind); + if (!StrEqual(name, "atac")) { + return; + } + + char sName[32]; + Format(sName, sizeof(sName), "%T", "Blind", LANG_SERVER); + ATAC_RegisterPunishment(sName, AtacPunishment_Blind); } /** * ATAC Punishments */ -public AtacPunishment_Blind(victim, attacker) +public void AtacPunishment_Blind(int victim, int attacker) { - PrintToChatAll("%c[ATAC]%c %t", CLR_GREEN, CLR_DEFAULT, "Blinded", attacker, ATAC_GetInfo(attacker, AtacInfo_Kills), ATAC_GetSetting(AtacSetting_KillsLimit)); - - new iDuration = 1536; - new iHoldTime = 1536; - new iFlags = (0x0002 | 0x0008); - new iColor[4] = {0, 0, 0, 0}; - iColor[3] = GetConVarInt(g_hAmount); - - new Handle:hMessage = StartMessageOne("Fade", attacker); - if(GetUserMessageType() == UM_Protobuf) - { - PbSetInt(hMessage, "duration", iDuration); - PbSetInt(hMessage, "hold_time", iHoldTime); - PbSetInt(hMessage, "flags", iFlags); - PbSetColor(hMessage, "clr", iColor); - } - else - { - BfWriteShort(hMessage, iDuration); - BfWriteShort(hMessage, iHoldTime); - BfWriteShort(hMessage, iFlags); - BfWriteByte(hMessage, iColor[0]); - BfWriteByte(hMessage, iColor[1]); - BfWriteByte(hMessage, iColor[2]); - BfWriteByte(hMessage, iColor[3]); - } - EndMessage(); -} \ No newline at end of file + PrintToChatAll("%c[ATAC]%c %t", CLR_GREEN, CLR_DEFAULT, "Blinded", attacker, ATAC_GetInfo(attacker, AtacInfo_Kills), ATAC_GetSetting(AtacSetting_KillsLimit)); + + int iDuration = 1536, + iHoldTime = 1536, + iFlags = (0x0002 | 0x0008), + iColor[4] = {0, 0, 0, 0}; + iColor[3] = g_hAmount.IntValue; + + Handle hMessage = StartMessageOne("Fade", attacker); + if (GetUserMessageType() == UM_Protobuf) { + PbSetInt(hMessage, "duration", iDuration); + PbSetInt(hMessage, "hold_time", iHoldTime); + PbSetInt(hMessage, "flags", iFlags); + PbSetColor(hMessage, "clr", iColor); + } else { + BfWriteShort(hMessage, iDuration); + BfWriteShort(hMessage, iHoldTime); + BfWriteShort(hMessage, iFlags); + BfWriteByte(hMessage, iColor[0]); + BfWriteByte(hMessage, iColor[1]); + BfWriteByte(hMessage, iColor[2]); + BfWriteByte(hMessage, iColor[3]); + } + EndMessage(); +} diff --git a/addons/sourcemod/scripting/atac-css.sp b/addons/sourcemod/scripting/atac-css.sp index 8d5e8e4..5ce96fa 100644 --- a/addons/sourcemod/scripting/atac-css.sp +++ b/addons/sourcemod/scripting/atac-css.sp @@ -1,235 +1,245 @@ -#pragma semicolon 1 - #include #include - #undef REQUIRE_PLUGIN #include -public Plugin:myinfo = +#pragma newdecls required +#pragma semicolon 1 + +public Plugin myinfo = { - name = "ATAC - Counter-Strike: Source Module", - author = "GameConnect", - description = "Advanced Team Attack Control", - version = ATAC_VERSION, - url = "http://www.gameconnect.net" + name = "ATAC - Counter-Strike: Source Module", + author = "GameConnect", + description = "Advanced Team Attack Control", + version = ATAC_VERSION, + url = "http://www.gameconnect.net" }; /** * Globals */ -new g_iExplosionModel; -new g_iLightningModel; -new g_iSmokeModel; -new g_iSpawnTime[MAXPLAYERS + 1]; -new Handle:g_hBombDefusedKarma; -new Handle:g_hBombExplodedKarma; -new Handle:g_hBombPlantedKarma; -new Handle:g_hHealDamage; -new Handle:g_hHostageRescuedKarma; -new Handle:g_hMirrorDamage; -new Handle:g_hMirrorDamageSlap; -new Handle:g_hRoundWinKarma; -new Handle:g_hSpawnProtectTime; +int g_iExplosionModel; +int g_iLightningModel; +int g_iSmokeModel; +int g_iSpawnTime[MAXPLAYERS + 1]; +ConVar g_hBombDefusedKarma; +ConVar g_hBombExplodedKarma; +ConVar g_hBombPlantedKarma; +ConVar g_hHealDamage; +ConVar g_hHostageRescuedKarma; +ConVar g_hMirrorDamage; +ConVar g_hMirrorDamageSlap; +ConVar g_hRoundWinKarma; +ConVar g_hSpawnProtectTime; /** * Plugin Forwards */ -public OnPluginStart() +public void OnPluginStart() { - decl String:sGameDir[64]; - GetGameFolderName(sGameDir, sizeof(sGameDir)); - if(!StrEqual(sGameDir, "cstrike")) - SetFailState("This plugin only works on Counter-Strike: Source."); - - // Create convars - g_hBombDefusedKarma = CreateConVar("atac_bombdefused_karma", "3", "ATAC Bomb Defused Karma", FCVAR_PLUGIN); - g_hBombExplodedKarma = CreateConVar("atac_bombexploded_karma", "2", "ATAC Bomb Exploded Karma", FCVAR_PLUGIN); - g_hBombPlantedKarma = CreateConVar("atac_bombplanted_karma", "1", "ATAC Bomb Planted Karma", FCVAR_PLUGIN); - g_hHealDamage = CreateConVar("atac_heal_damage", "0", "ATAC Heal Damage", FCVAR_PLUGIN); - g_hHostageRescuedKarma = CreateConVar("atac_hostagerescued_karma", "1", "ATAC Hostage Rescued Karma", FCVAR_PLUGIN); - g_hMirrorDamage = CreateConVar("atac_mirrordamage", "1", "ATAC Mirror Damage", FCVAR_PLUGIN); - g_hMirrorDamageSlap = CreateConVar("atac_mirrordamage_slap", "0", "ATAC Mirror Damage Slap", FCVAR_PLUGIN); - g_hRoundWinKarma = CreateConVar("atac_roundwin_karma", "2", "ATAC Round Win Karma", FCVAR_PLUGIN); - g_hSpawnProtectTime = CreateConVar("atac_spawnprotect_time", "10", "ATAC Spawn Protect Time", FCVAR_PLUGIN); - - // Hook events - HookEvent("bomb_defused", Event_BombDefused); - HookEvent("bomb_exploded", Event_BombExploded); - HookEvent("bomb_planted", Event_BombPlanted); - HookEvent("hostage_rescued", Event_HostageRescued); - HookEvent("player_hurt", Event_PlayerHurt); - HookEvent("player_spawn", Event_PlayerSpawn); - HookEvent("round_end", Event_RoundEnd); - - // Load translations - LoadTranslations("atac-css.phrases"); + char sGameDir[64]; + GetGameFolderName(sGameDir, sizeof(sGameDir)); + if (!StrEqual(sGameDir, "cstrike")) { + SetFailState("This plugin only works on Counter-Strike: Source."); + } + + // Create convars + g_hBombDefusedKarma = CreateConVar("atac_bombdefused_karma", "3", "ATAC Bomb Defused Karma"); + g_hBombExplodedKarma = CreateConVar("atac_bombexploded_karma", "2", "ATAC Bomb Exploded Karma"); + g_hBombPlantedKarma = CreateConVar("atac_bombplanted_karma", "1", "ATAC Bomb Planted Karma"); + g_hHealDamage = CreateConVar("atac_heal_damage", "0", "ATAC Heal Damage"); + g_hHostageRescuedKarma = CreateConVar("atac_hostagerescued_karma", "1", "ATAC Hostage Rescued Karma"); + g_hMirrorDamage = CreateConVar("atac_mirrordamage", "1", "ATAC Mirror Damage"); + g_hMirrorDamageSlap = CreateConVar("atac_mirrordamage_slap", "0", "ATAC Mirror Damage Slap"); + g_hRoundWinKarma = CreateConVar("atac_roundwin_karma", "2", "ATAC Round Win Karma"); + g_hSpawnProtectTime = CreateConVar("atac_spawnprotect_time", "10", "ATAC Spawn Protect Time"); + + // Hook events + HookEvent("bomb_defused", Event_BombDefused); + HookEvent("bomb_exploded", Event_BombExploded); + HookEvent("bomb_planted", Event_BombPlanted); + HookEvent("hostage_rescued", Event_HostageRescued); + HookEvent("player_hurt", Event_PlayerHurt); + HookEvent("player_spawn", Event_PlayerSpawn); + HookEvent("round_end", Event_RoundEnd); + + // Load translations + LoadTranslations("atac-css.phrases"); } -public OnMapStart() +public void OnMapStart() { - g_iExplosionModel = PrecacheModel("materials/effects/fire_cloud1.vmt"); - g_iLightningModel = PrecacheModel("materials/sprites/tp_beam001.vmt"); - g_iSmokeModel = PrecacheModel("materials/effects/fire_cloud2.vmt"); - - PrecacheSound("ambient/explosions/explode_8.wav"); + g_iExplosionModel = PrecacheModel("materials/effects/fire_cloud1.vmt"); + g_iLightningModel = PrecacheModel("materials/sprites/tp_beam001.vmt"); + g_iSmokeModel = PrecacheModel("materials/effects/fire_cloud2.vmt"); + + PrecacheSound("ambient/explosions/explode_8.wav"); } /** * Events */ -public Event_BombDefused(Handle:event, const String:name[], bool:dontBroadcast) +public void Event_BombDefused(Handle event, const char[] name, bool dontBroadcast) { - if(!ATAC_GetSetting(AtacSetting_Enabled)) - return; - - decl String:sReason[256]; - new iClient = GetClientOfUserId(GetEventInt(event, "userid")); - - Format(sReason, sizeof(sReason), "%T", "Defusing Bomb", iClient); - ATAC_GiveKarma(iClient, GetConVarInt(g_hBombDefusedKarma), sReason); + if (!ATAC_GetSetting(AtacSetting_Enabled)) { + return; + } + + char sReason[256]; + int iClient = GetClientOfUserId(GetEventInt(event, "userid")); + + Format(sReason, sizeof(sReason), "%T", "Defusing Bomb", iClient); + ATAC_GiveKarma(iClient, g_hBombDefusedKarma.IntValue, sReason); } -public Event_BombExploded(Handle:event, const String:name[], bool:dontBroadcast) +public void Event_BombExploded(Handle event, const char[] name, bool dontBroadcast) { - if(!ATAC_GetSetting(AtacSetting_Enabled)) - return; - - decl String:sReason[256]; - new iClient = GetClientOfUserId(GetEventInt(event, "userid")); - - Format(sReason, sizeof(sReason), "%T", "Detonating Bomb", iClient); - ATAC_GiveKarma(iClient, GetConVarInt(g_hBombExplodedKarma), sReason); + if (!ATAC_GetSetting(AtacSetting_Enabled)) { + return; + } + + char sReason[256]; + int iClient = GetClientOfUserId(GetEventInt(event, "userid")); + + Format(sReason, sizeof(sReason), "%T", "Detonating Bomb", iClient); + ATAC_GiveKarma(iClient, g_hBombExplodedKarma.IntValue, sReason); } -public Event_BombPlanted(Handle:event, const String:name[], bool:dontBroadcast) +public void Event_BombPlanted(Handle event, const char[] name, bool dontBroadcast) { - if(!ATAC_GetSetting(AtacSetting_Enabled)) - return; - - decl String:sReason[256]; - new iClient = GetClientOfUserId(GetEventInt(event, "userid")); - - Format(sReason, sizeof(sReason), "%T", "Planting Bomb", iClient); - ATAC_GiveKarma(iClient, GetConVarInt(g_hBombPlantedKarma), sReason); + if (!ATAC_GetSetting(AtacSetting_Enabled)) { + return; + } + + char sReason[256]; + int iClient = GetClientOfUserId(GetEventInt(event, "userid")); + + Format(sReason, sizeof(sReason), "%T", "Planting Bomb", iClient); + ATAC_GiveKarma(iClient, g_hBombPlantedKarma.IntValue, sReason); } -public Event_HostageRescued(Handle:event, const String:name[], bool:dontBroadcast) +public void Event_HostageRescued(Handle event, const char[] name, bool dontBroadcast) { - if(!ATAC_GetSetting(AtacSetting_Enabled)) - return; - - decl String:sReason[256]; - new iClient = GetClientOfUserId(GetEventInt(event, "userid")); - - Format(sReason, sizeof(sReason), "%T", "Rescuing Hostage", iClient); - ATAC_GiveKarma(iClient, GetConVarInt(g_hHostageRescuedKarma), sReason); + if (!ATAC_GetSetting(AtacSetting_Enabled)) { + return; + } + + char sReason[256]; + int iClient = GetClientOfUserId(GetEventInt(event, "userid")); + + Format(sReason, sizeof(sReason), "%T", "Rescuing Hostage", iClient); + ATAC_GiveKarma(iClient, g_hHostageRescuedKarma.IntValue, sReason); } -public Event_PlayerHurt(Handle:event, const String:name[], bool:dontBroadcast) +public void Event_PlayerHurt(Handle event, const char[] name, bool dontBroadcast) { - new iAttacker = GetClientOfUserId(GetEventInt(event, "attacker")), - iDamage = GetEventInt(event, "dmg_health"), - iVictim = GetClientOfUserId(GetEventInt(event, "userid")); - - if(!ATAC_GetSetting(AtacSetting_Enabled) || !iAttacker || iAttacker == iVictim || GetClientTeam(iAttacker) != GetClientTeam(iVictim)) - return; - - if(GetConVarBool(g_hHealDamage)) - SetEntityHealth(iVictim, GetClientHealth(iVictim) + iDamage); - - if(GetConVarBool(g_hMirrorDamage)) - { - new iHealth = GetClientHealth(iAttacker) - iDamage; - if(iHealth <= 0) - { - ForcePlayerSuicide(iAttacker); - return; - } - if(GetConVarBool(g_hMirrorDamageSlap)) - SlapPlayer(iAttacker, iDamage); - else - SetEntityHealth(iAttacker, iHealth); - } - - // If ignoring bots is enabled, and attacker or victim is a bot, ignore - if(ATAC_GetSetting(AtacSetting_IgnoreBots) && (IsFakeClient(iAttacker) || IsFakeClient(iVictim))) - return; - - // If immunity is enabled, and attacker has custom6 or root flag, ignore - if(ATAC_GetSetting(AtacSetting_Immunity) && GetUserFlagBits(iAttacker) & (ADMFLAG_CUSTOM6|ADMFLAG_ROOT)) - return; - - // If spawn protection is disabled, or the spawn protection has expired, ignore - new iProtectTime = GetConVarInt(g_hSpawnProtectTime); - if(!iProtectTime || GetTime() - g_iSpawnTime[iVictim] > iProtectTime) - return; - - PrintToChatAll("%c[ATAC]%c %t", CLR_GREEN, CLR_DEFAULT, "Spawn Attacking", iAttacker, iVictim); - SlayEffects(iAttacker); - ForcePlayerSuicide(iAttacker); + int iAttacker = GetClientOfUserId(GetEventInt(event, "attacker")), + iDamage = GetEventInt(event, "dmg_health"), + iVictim = GetClientOfUserId(GetEventInt(event, "userid")); + + if (!ATAC_GetSetting(AtacSetting_Enabled) || !iAttacker || iAttacker == iVictim || GetClientTeam(iAttacker) != GetClientTeam(iVictim)) { + return; + } + + if (g_hHealDamage.BoolValue) { + SetEntityHealth(iVictim, GetClientHealth(iVictim) + iDamage); + } + + if (g_hMirrorDamage.BoolValue) { + int iHealth = GetClientHealth(iAttacker) - iDamage; + if (iHealth <= 0) { + ForcePlayerSuicide(iAttacker); + return; + } + if (g_hMirrorDamageSlap.BoolValue) { + SlapPlayer(iAttacker, iDamage); + } else { + SetEntityHealth(iAttacker, iHealth); + } + } + + // If ignoring bots is enabled, and attacker or victim is a bot, ignore + if (ATAC_GetSetting(AtacSetting_IgnoreBots) && (IsFakeClient(iAttacker) || IsFakeClient(iVictim))) { + return; + } + + // If immunity is enabled, and attacker has custom6 or root flag, ignore + if (ATAC_GetSetting(AtacSetting_Immunity) && GetUserFlagBits(iAttacker) & (ADMFLAG_CUSTOM6|ADMFLAG_ROOT)) { + return; + } + + // If spawn protection is disabled, or the spawn protection has expired, ignore + int iProtectTime = g_hSpawnProtectTime.IntValue; + if (!iProtectTime || GetTime() - g_iSpawnTime[iVictim] > iProtectTime) { + return; + } + + PrintToChatAll("%c[ATAC]%c %t", CLR_GREEN, CLR_DEFAULT, "Spawn Attacking", iAttacker, iVictim); + SlayEffects(iAttacker); + ForcePlayerSuicide(iAttacker); } -public Event_PlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast) +public void Event_PlayerSpawn(Handle event, const char[] name, bool dontBroadcast) { - g_iSpawnTime[GetClientOfUserId(GetEventInt(event, "userid"))] = GetTime(); + g_iSpawnTime[GetClientOfUserId(GetEventInt(event, "userid"))] = GetTime(); } -public Event_RoundEnd(Handle:event, const String:name[], bool:dontBroadcast) +public void Event_RoundEnd(Handle event, const char[] name, bool dontBroadcast) { - if(!ATAC_GetSetting(AtacSetting_Enabled)) - return; - - decl String:sReason[256]; - new iKarma = GetConVarInt(g_hRoundWinKarma); - - for(new i = 1, iTeam = GetEventInt(event, "winner"); i <= MaxClients; i++) - { - if(!IsClientInGame(i) || GetClientTeam(i) != iTeam) - continue; - - Format(sReason, sizeof(sReason), "%T", "Winning Round", i); - ATAC_GiveKarma(i, iKarma, sReason); - } + if (!ATAC_GetSetting(AtacSetting_Enabled)) { + return; + } + + char sReason[256]; + int iKarma = g_hRoundWinKarma.IntValue; + + for (int i = 1, iTeam = GetEventInt(event, "winner"); i <= MaxClients; i++) { + if (!IsClientInGame(i) || GetClientTeam(i) != iTeam) { + continue; + } + + Format(sReason, sizeof(sReason), "%T", "Winning Round", i); + ATAC_GiveKarma(i, iKarma, sReason); + } } /** * Stocks */ -stock SlayEffects(client) +void SlayEffects(int client) { - decl Float:flEnd[3], Float:flSparkDir[3], Float:flSparkPos[3], Float:flStart[3]; - // Get player position to use as the ending coordinates - GetClientAbsOrigin(client, flEnd); - - // Set the starting coordinates - flSparkDir = flEnd; - flSparkPos = flEnd; - flStart = flEnd; - - flSparkDir[2] += 23; - flSparkPos[2] += 13; - flStart[2] += 1000; - - // create lightning effects and sparks, and explosion - TE_SetupBeamPoints(flStart, flEnd, g_iLightningModel, g_iLightningModel, 0, 1, 2.0, 5.0, 5.0, 1, 1.0, {255, 255, 255, 255}, 250); - TE_SendToAll(); - - TE_SetupExplosion(flEnd, g_iExplosionModel, 10.0, 10, TE_EXPLFLAG_NONE, 200, 255); - TE_SendToAll(); - - TE_SetupSmoke(flEnd, g_iExplosionModel, 50.0, 2); - TE_SendToAll(); - - TE_SetupSmoke(flEnd, g_iSmokeModel, 50.0, 2); - TE_SendToAll(); - - TE_SetupMetalSparks(flSparkPos, flSparkDir); - TE_SendToAll(); - - EmitAmbientSound("ambient/explosions/explode_8.wav", flEnd, SOUND_FROM_WORLD, SNDLEVEL_NORMAL, SND_NOFLAGS, 1.0, SNDPITCH_NORMAL, 0.0); -} \ No newline at end of file + float flEnd[3], flSparkDir[3], flSparkPos[3], flStart[3]; + // Get player position to use as the ending coordinates + GetClientAbsOrigin(client, flEnd); + + // Set the starting coordinates + flSparkDir = flEnd; + flSparkPos = flEnd; + flStart = flEnd; + + flSparkDir[2] += 23; + flSparkPos[2] += 13; + flStart[2] += 1000; + + // create lightning effects and sparks, and explosion + TE_SetupBeamPoints(flStart, flEnd, g_iLightningModel, g_iLightningModel, 0, 1, 2.0, 5.0, 5.0, 1, 1.0, {255, 255, 255, 255}, 250); + TE_SendToAll(); + + TE_SetupExplosion(flEnd, g_iExplosionModel, 10.0, 10, TE_EXPLFLAG_NONE, 200, 255); + TE_SendToAll(); + + TE_SetupSmoke(flEnd, g_iExplosionModel, 50.0, 2); + TE_SendToAll(); + + TE_SetupSmoke(flEnd, g_iSmokeModel, 50.0, 2); + TE_SendToAll(); + + TE_SetupMetalSparks(flSparkPos, flSparkDir); + TE_SendToAll(); + + EmitAmbientSound("ambient/explosions/explode_8.wav", flEnd, SOUND_FROM_WORLD, SNDLEVEL_NORMAL, SND_NOFLAGS, 1.0, SNDPITCH_NORMAL, 0.0); +} diff --git a/addons/sourcemod/scripting/atac-dods.sp b/addons/sourcemod/scripting/atac-dods.sp index b2eff53..4ad7dc7 100644 --- a/addons/sourcemod/scripting/atac-dods.sp +++ b/addons/sourcemod/scripting/atac-dods.sp @@ -1,284 +1,296 @@ -#pragma semicolon 1 - #include #include - #undef REQUIRE_PLUGIN #include -public Plugin:myinfo = +#pragma newdecls required +#pragma semicolon 1 + +public Plugin myinfo = { - name = "ATAC - Day of Defeat: Source Module", - author = "GameConnect", - description = "Advanced Team Attack Control", - version = ATAC_VERSION, - url = "http://www.gameconnect.net" + name = "ATAC - Day of Defeat: Source Module", + author = "GameConnect", + description = "Advanced Team Attack Control", + version = ATAC_VERSION, + url = "http://www.gameconnect.net" }; /** * Globals */ -new g_iExplosionModel; -new g_iLightningModel; -new g_iSmokeModel; -new g_iSpawnTime[MAXPLAYERS + 1]; -new Handle:g_hBombDefusedKarma; -new Handle:g_hBombExplodedKarma; -new Handle:g_hBombPlantedKarma; -new Handle:g_hCaptureBlockedKarma; -new Handle:g_hHealDamage; -new Handle:g_hKillDefuserKarma; -new Handle:g_hKillPlanterKarma; -new Handle:g_hMirrorDamage; -new Handle:g_hMirrorDamageSlap; -new Handle:g_hPointCaptureKarma; -new Handle:g_hRoundWinKarma; -new Handle:g_hSpawnProtectTime; +int g_iExplosionModel; +int g_iLightningModel; +int g_iSmokeModel; +int g_iSpawnTime[MAXPLAYERS + 1]; +ConVar g_hBombDefusedKarma; +ConVar g_hBombExplodedKarma; +ConVar g_hBombPlantedKarma; +ConVar g_hCaptureBlockedKarma; +ConVar g_hHealDamage; +ConVar g_hKillDefuserKarma; +ConVar g_hKillPlanterKarma; +ConVar g_hMirrorDamage; +ConVar g_hMirrorDamageSlap; +ConVar g_hPointCaptureKarma; +ConVar g_hRoundWinKarma; +ConVar g_hSpawnProtectTime; /** * Plugin Forwards */ -public OnPluginStart() +public void OnPluginStart() { - decl String:sGameDir[64]; - GetGameFolderName(sGameDir, sizeof(sGameDir)); - if(!StrEqual(sGameDir, "dod")) - SetFailState("This plugin only works on Day of Defeat: Source."); - - // Create convars - g_hBombDefusedKarma = CreateConVar("atac_bombdefused_karma", "2", "ATAC Bomb Defused Karma", FCVAR_PLUGIN); - g_hBombExplodedKarma = CreateConVar("atac_bombexploded_karma", "2", "ATAC Bomb Exploded Karma", FCVAR_PLUGIN); - g_hBombPlantedKarma = CreateConVar("atac_bombplanted_karma", "1", "ATAC Bomb Planted Karma", FCVAR_PLUGIN); - g_hCaptureBlockedKarma = CreateConVar("atac_captureblocked_karma", "2", "ATAC Capture Blocked Karma", FCVAR_PLUGIN); - g_hHealDamage = CreateConVar("atac_heal_damage", "0", "ATAC Heal Damage", FCVAR_PLUGIN); - g_hKillDefuserKarma = CreateConVar("atac_killdefuser_karma", "1", "ATAC Kill Defuser Karma", FCVAR_PLUGIN); - g_hKillPlanterKarma = CreateConVar("atac_killplanter_karma", "1", "ATAC Kill Planter Karma", FCVAR_PLUGIN); - g_hMirrorDamage = CreateConVar("atac_mirrordamage", "1", "ATAC Mirror Damage", FCVAR_PLUGIN); - g_hMirrorDamageSlap = CreateConVar("atac_mirrordamage_slap", "0", "ATAC Mirror Damage Slap", FCVAR_PLUGIN); - g_hPointCaptureKarma = CreateConVar("atac_pointcapture_karma", "3", "ATAC Point Capture Karma", FCVAR_PLUGIN); - g_hRoundWinKarma = CreateConVar("atac_roundwin_karma", "2", "ATAC Round Win Karma", FCVAR_PLUGIN); - g_hSpawnProtectTime = CreateConVar("atac_spawnprotect_time", "10", "ATAC Spawn Protect Time", FCVAR_PLUGIN); - - // Hook events - HookEvent("dod_bomb_planted", Event_BombPlanted); - HookEvent("dod_bomb_exploded", Event_BombExploded); - HookEvent("dod_bomb_defused", Event_BombDefused); - HookEvent("dod_capture_blocked", Event_CaptureBlocked); - HookEvent("dod_kill_defuser", Event_KillDefuser); - HookEvent("dod_kill_planter", Event_KillPlanter); - HookEvent("player_hurt", Event_PlayerHurt); - HookEvent("player_spawn", Event_PlayerSpawn); - HookEvent("dod_point_captured", Event_PointCaptured); - HookEvent("dod_round_win", Event_RoundWin); - - // Load translations - LoadTranslations("atac-dods.phrases"); + char sGameDir[64]; + GetGameFolderName(sGameDir, sizeof(sGameDir)); + if (!StrEqual(sGameDir, "dod")) { + SetFailState("This plugin only works on Day of Defeat: Source."); + } + + // Create convars + g_hBombDefusedKarma = CreateConVar("atac_bombdefused_karma", "2", "ATAC Bomb Defused Karma"); + g_hBombExplodedKarma = CreateConVar("atac_bombexploded_karma", "2", "ATAC Bomb Exploded Karma"); + g_hBombPlantedKarma = CreateConVar("atac_bombplanted_karma", "1", "ATAC Bomb Planted Karma"); + g_hCaptureBlockedKarma = CreateConVar("atac_captureblocked_karma", "2", "ATAC Capture Blocked Karma"); + g_hHealDamage = CreateConVar("atac_heal_damage", "0", "ATAC Heal Damage"); + g_hKillDefuserKarma = CreateConVar("atac_killdefuser_karma", "1", "ATAC Kill Defuser Karma"); + g_hKillPlanterKarma = CreateConVar("atac_killplanter_karma", "1", "ATAC Kill Planter Karma"); + g_hMirrorDamage = CreateConVar("atac_mirrordamage", "1", "ATAC Mirror Damage"); + g_hMirrorDamageSlap = CreateConVar("atac_mirrordamage_slap", "0", "ATAC Mirror Damage Slap"); + g_hPointCaptureKarma = CreateConVar("atac_pointcapture_karma", "3", "ATAC Point Capture Karma"); + g_hRoundWinKarma = CreateConVar("atac_roundwin_karma", "2", "ATAC Round Win Karma"); + g_hSpawnProtectTime = CreateConVar("atac_spawnprotect_time", "10", "ATAC Spawn Protect Time"); + + // Hook events + HookEvent("dod_bomb_planted", Event_BombPlanted); + HookEvent("dod_bomb_exploded", Event_BombExploded); + HookEvent("dod_bomb_defused", Event_BombDefused); + HookEvent("dod_capture_blocked", Event_CaptureBlocked); + HookEvent("dod_kill_defuser", Event_KillDefuser); + HookEvent("dod_kill_planter", Event_KillPlanter); + HookEvent("player_hurt", Event_PlayerHurt); + HookEvent("player_spawn", Event_PlayerSpawn); + HookEvent("dod_point_captured", Event_PointCaptured); + HookEvent("dod_round_win", Event_RoundWin); + + // Load translations + LoadTranslations("atac-dods.phrases"); } -public OnMapStart() +public void OnMapStart() { - g_iExplosionModel = PrecacheModel("materials/effects/fire_cloud1.vmt"); - g_iLightningModel = PrecacheModel("materials/sprites/tp_beam001.vmt"); - g_iSmokeModel = PrecacheModel("materials/effects/fire_cloud2.vmt"); - - PrecacheSound("ambient/explosions/explode_8.wav"); + g_iExplosionModel = PrecacheModel("materials/effects/fire_cloud1.vmt"); + g_iLightningModel = PrecacheModel("materials/sprites/tp_beam001.vmt"); + g_iSmokeModel = PrecacheModel("materials/effects/fire_cloud2.vmt"); + + PrecacheSound("ambient/explosions/explode_8.wav"); } /** * Events */ -public Event_BombDefused(Handle:event, const String:name[], bool:dontBroadcast) +public void Event_BombDefused(Handle event, const char[] name, bool dontBroadcast) { - if(!ATAC_GetSetting(AtacSetting_Enabled)) - return; - - decl String:sReason[256]; - new iClient = GetClientOfUserId(GetEventInt(event, "userid")); - - Format(sReason, sizeof(sReason), "%T", "Defusing Bomb", iClient); - ATAC_GiveKarma(iClient, GetConVarInt(g_hBombDefusedKarma), sReason); + if (!ATAC_GetSetting(AtacSetting_Enabled)) { + return; + } + + char sReason[256]; + int iClient = GetClientOfUserId(GetEventInt(event, "userid")); + + Format(sReason, sizeof(sReason), "%T", "Defusing Bomb", iClient); + ATAC_GiveKarma(iClient, g_hBombDefusedKarma.IntValue, sReason); } -public Event_BombExploded(Handle:event, const String:name[], bool:dontBroadcast) +public void Event_BombExploded(Handle event, const char[] name, bool dontBroadcast) { - if(!ATAC_GetSetting(AtacSetting_Enabled)) - return; - - decl String:sReason[256]; - new iClient = GetClientOfUserId(GetEventInt(event, "userid")); - - Format(sReason, sizeof(sReason), "%T", "Detonating Bomb", iClient); - ATAC_GiveKarma(iClient, GetConVarInt(g_hBombExplodedKarma), sReason); + if (!ATAC_GetSetting(AtacSetting_Enabled)) { + return; + } + + char sReason[256]; + int iClient = GetClientOfUserId(GetEventInt(event, "userid")); + + Format(sReason, sizeof(sReason), "%T", "Detonating Bomb", iClient); + ATAC_GiveKarma(iClient, g_hBombExplodedKarma.IntValue, sReason); } -public Event_BombPlanted(Handle:event, const String:name[], bool:dontBroadcast) +public void Event_BombPlanted(Handle event, const char[] name, bool dontBroadcast) { - if(!ATAC_GetSetting(AtacSetting_Enabled)) - return; - - decl String:sReason[256]; - new iClient = GetClientOfUserId(GetEventInt(event, "userid")); - - Format(sReason, sizeof(sReason), "%T", "Planting Bomb", iClient); - ATAC_GiveKarma(iClient, GetConVarInt(g_hBombPlantedKarma), sReason); + if (!ATAC_GetSetting(AtacSetting_Enabled)) { + return; + } + + char sReason[256]; + int iClient = GetClientOfUserId(GetEventInt(event, "userid")); + + Format(sReason, sizeof(sReason), "%T", "Planting Bomb", iClient); + ATAC_GiveKarma(iClient, g_hBombPlantedKarma.IntValue, sReason); } -public Event_CaptureBlocked(Handle:event, const String:name[], bool:dontBroadcast) +public void Event_CaptureBlocked(Handle event, const char[] name, bool dontBroadcast) { - if(!ATAC_GetSetting(AtacSetting_Enabled)) - return; - - decl String:sReason[256]; - new iClient = GetClientOfUserId(GetEventInt(event, "blocker")); - - Format(sReason, sizeof(sReason), "%T", "Blocking Capture", iClient); - ATAC_GiveKarma(iClient, GetConVarInt(g_hCaptureBlockedKarma), sReason); + if (!ATAC_GetSetting(AtacSetting_Enabled)) { + return; + } + + char sReason[256]; + int iClient = GetClientOfUserId(GetEventInt(event, "blocker")); + + Format(sReason, sizeof(sReason), "%T", "Blocking Capture", iClient); + ATAC_GiveKarma(iClient, g_hCaptureBlockedKarma.IntValue, sReason); } -public Event_KillDefuser(Handle:event, const String:name[], bool:dontBroadcast) +public void Event_KillDefuser(Handle event, const char[] name, bool dontBroadcast) { - if(!ATAC_GetSetting(AtacSetting_Enabled)) - return; - - decl String:sReason[256]; - new iClient = GetClientOfUserId(GetEventInt(event, "userid")); - - Format(sReason, sizeof(sReason), "%T", "Killing Defuser", iClient); - ATAC_GiveKarma(iClient, GetConVarInt(g_hKillDefuserKarma), sReason); + if (!ATAC_GetSetting(AtacSetting_Enabled)) { + return; + } + + char sReason[256]; + int iClient = GetClientOfUserId(GetEventInt(event, "userid")); + + Format(sReason, sizeof(sReason), "%T", "Killing Defuser", iClient); + ATAC_GiveKarma(iClient, g_hKillDefuserKarma.IntValue, sReason); } -public Event_KillPlanter(Handle:event, const String:name[], bool:dontBroadcast) +public void Event_KillPlanter(Handle event, const char[] name, bool dontBroadcast) { - if(!ATAC_GetSetting(AtacSetting_Enabled)) - return; - - decl String:sReason[256]; - new iClient = GetClientOfUserId(GetEventInt(event, "userid")); - - Format(sReason, sizeof(sReason), "%T", "Killing Planter", iClient); - ATAC_GiveKarma(iClient, GetConVarInt(g_hKillPlanterKarma), sReason); + if (!ATAC_GetSetting(AtacSetting_Enabled)) { + return; + } + + char sReason[256]; + int iClient = GetClientOfUserId(GetEventInt(event, "userid")); + + Format(sReason, sizeof(sReason), "%T", "Killing Planter", iClient); + ATAC_GiveKarma(iClient, g_hKillPlanterKarma.IntValue, sReason); } -public Event_PlayerHurt(Handle:event, const String:name[], bool:dontBroadcast) +public void Event_PlayerHurt(Handle event, const char[] name, bool dontBroadcast) { - new iAttacker = GetClientOfUserId(GetEventInt(event, "attacker")), - iDamage = GetEventInt(event, "damage"), - iVictim = GetClientOfUserId(GetEventInt(event, "userid")); - - if(!ATAC_GetSetting(AtacSetting_Enabled) || !iAttacker || iAttacker == iVictim || GetClientTeam(iAttacker) != GetClientTeam(iVictim)) - return; - - if(GetConVarBool(g_hHealDamage)) - SetEntityHealth(iVictim, GetClientHealth(iVictim) + iDamage); - - if(GetConVarBool(g_hMirrorDamage)) - { - new iHealth = GetClientHealth(iAttacker) - iDamage; - if(iHealth <= 0) - { - ForcePlayerSuicide(iAttacker); - return; - } - if(GetConVarBool(g_hMirrorDamageSlap)) - SlapPlayer(iAttacker, iDamage); - else - SetEntityHealth(iAttacker, iHealth); - } - - // If ignoring bots is enabled, and attacker or victim is a bot, ignore - if(ATAC_GetSetting(AtacSetting_IgnoreBots) && (IsFakeClient(iAttacker) || IsFakeClient(iVictim))) - return; - - // If immunity is enabled, and attacker has custom6 or root flag, ignore - if(ATAC_GetSetting(AtacSetting_Immunity) && GetUserFlagBits(iAttacker) & (ADMFLAG_CUSTOM6|ADMFLAG_ROOT)) - return; - - // If spawn protection is disabled, or the spawn protection has expired, ignore - new iProtectTime = GetConVarInt(g_hSpawnProtectTime); - if(!iProtectTime || GetTime() - g_iSpawnTime[iVictim] > iProtectTime) - return; - - PrintToChatAll("%c[ATAC]%c %t", CLR_GREEN, CLR_DEFAULT, "Spawn Attacking", iAttacker, iVictim); - SlayEffects(iAttacker); - ForcePlayerSuicide(iAttacker); + int iAttacker = GetClientOfUserId(GetEventInt(event, "attacker")), + iDamage = GetEventInt(event, "damage"), + iVictim = GetClientOfUserId(GetEventInt(event, "userid")); + + if (!ATAC_GetSetting(AtacSetting_Enabled) || !iAttacker || iAttacker == iVictim || GetClientTeam(iAttacker) != GetClientTeam(iVictim)) { + return; + } + + if (g_hHealDamage.BoolValue) { + SetEntityHealth(iVictim, GetClientHealth(iVictim) + iDamage); + } + + if (g_hMirrorDamage.BoolValue) { + int iHealth = GetClientHealth(iAttacker) - iDamage; + if (iHealth <= 0) { + ForcePlayerSuicide(iAttacker); + return; + } + if (g_hMirrorDamageSlap.BoolValue) { + SlapPlayer(iAttacker, iDamage); + } else { + SetEntityHealth(iAttacker, iHealth); + } + } + + // If ignoring bots is enabled, and attacker or victim is a bot, ignore + if (ATAC_GetSetting(AtacSetting_IgnoreBots) && (IsFakeClient(iAttacker) || IsFakeClient(iVictim))) { + return; + } + + // If immunity is enabled, and attacker has custom6 or root flag, ignore + if (ATAC_GetSetting(AtacSetting_Immunity) && GetUserFlagBits(iAttacker) & (ADMFLAG_CUSTOM6|ADMFLAG_ROOT)) { + return; + } + + // If spawn protection is disabled, or the spawn protection has expired, ignore + int iProtectTime = g_hSpawnProtectTime.IntValue; + if (!iProtectTime || GetTime() - g_iSpawnTime[iVictim] > iProtectTime) { + return; + } + + PrintToChatAll("%c[ATAC]%c %t", CLR_GREEN, CLR_DEFAULT, "Spawn Attacking", iAttacker, iVictim); + SlayEffects(iAttacker); + ForcePlayerSuicide(iAttacker); } -public Event_PlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast) +public void Event_PlayerSpawn(Handle event, const char[] name, bool dontBroadcast) { - g_iSpawnTime[GetClientOfUserId(GetEventInt(event, "userid"))] = GetTime(); + g_iSpawnTime[GetClientOfUserId(GetEventInt(event, "userid"))] = GetTime(); } -public Event_PointCaptured(Handle:event, const String:name[], bool:dontBroadcast) +public void Event_PointCaptured(Handle event, const char[] name, bool dontBroadcast) { - if(!ATAC_GetSetting(AtacSetting_Enabled) || GetEventBool(event, "bomb")) - return; - - decl String:sCappers[256], String:sReason[256]; - new iKarma = GetConVarInt(g_hPointCaptureKarma); - GetEventString(event, "cappers", sCappers, sizeof(sCappers)); - - for(new i, iCappers = strlen(sCappers); i < iCappers; i++) - { - Format(sReason, sizeof(sReason), "%T", "Capturing Point", sCappers[i]); - ATAC_GiveKarma(sCappers[i], iKarma, sReason); - } + if (!ATAC_GetSetting(AtacSetting_Enabled) || GetEventBool(event, "bomb")) { + return; + } + + char sCappers[256], sReason[256]; + int iKarma = g_hPointCaptureKarma.IntValue; + GetEventString(event, "cappers", sCappers, sizeof(sCappers)); + + for (int i, iCappers = strlen(sCappers); i < iCappers; i++) { + Format(sReason, sizeof(sReason), "%T", "Capturing Point", sCappers[i]); + ATAC_GiveKarma(sCappers[i], iKarma, sReason); + } } -public Event_RoundWin(Handle:event, const String:name[], bool:dontBroadcast) +public void Event_RoundWin(Handle event, const char[] name, bool dontBroadcast) { - if(!ATAC_GetSetting(AtacSetting_Enabled)) - return; - - decl String:sReason[256]; - new iKarma = GetConVarInt(g_hRoundWinKarma); - - for(new i = 1, iTeam = GetEventInt(event, "team"); i <= MaxClients; i++) - { - if(!IsClientInGame(i) || GetClientTeam(i) != iTeam) - continue; - - Format(sReason, sizeof(sReason), "%T", "Winning Round", i); - ATAC_GiveKarma(i, iKarma, sReason); - } + if (!ATAC_GetSetting(AtacSetting_Enabled)) { + return; + } + + char sReason[256]; + int iKarma = g_hRoundWinKarma.IntValue; + + for (int i = 1, iTeam = GetEventInt(event, "team"); i <= MaxClients; i++) { + if (!IsClientInGame(i) || GetClientTeam(i) != iTeam) { + continue; + } + + Format(sReason, sizeof(sReason), "%T", "Winning Round", i); + ATAC_GiveKarma(i, iKarma, sReason); + } } /** * Stocks */ -stock SlayEffects(client) +void SlayEffects(int client) { - decl Float:flEnd[3], Float:flSparkDir[3], Float:flSparkPos[3], Float:flStart[3]; - // Get player position to use as the ending coordinates - GetClientAbsOrigin(client, flEnd); - - // Set the starting coordinates - flSparkDir = flEnd; - flSparkPos = flEnd; - flStart = flEnd; - - flSparkDir[2] += 23; - flSparkPos[2] += 13; - flStart[2] += 1000; - - // create lightning effects and sparks, and explosion - TE_SetupBeamPoints(flStart, flEnd, g_iLightningModel, g_iLightningModel, 0, 1, 2.0, 5.0, 5.0, 1, 1.0, {255, 255, 255, 255}, 250); - TE_SendToAll(); - - TE_SetupExplosion(flEnd, g_iExplosionModel, 10.0, 10, TE_EXPLFLAG_NONE, 200, 255); - TE_SendToAll(); - - TE_SetupSmoke(flEnd, g_iExplosionModel, 50.0, 2); - TE_SendToAll(); - - TE_SetupSmoke(flEnd, g_iSmokeModel, 50.0, 2); - TE_SendToAll(); - - TE_SetupMetalSparks(flSparkPos, flSparkDir); - TE_SendToAll(); - - EmitAmbientSound("ambient/explosions/explode_8.wav", flEnd, SOUND_FROM_WORLD, SNDLEVEL_NORMAL, SND_NOFLAGS, 1.0, SNDPITCH_NORMAL, 0.0); -} \ No newline at end of file + float flEnd[3], flSparkDir[3], flSparkPos[3], flStart[3]; + // Get player position to use as the ending coordinates + GetClientAbsOrigin(client, flEnd); + + // Set the starting coordinates + flSparkDir = flEnd; + flSparkPos = flEnd; + flStart = flEnd; + + flSparkDir[2] += 23; + flSparkPos[2] += 13; + flStart[2] += 1000; + + // create lightning effects and sparks, and explosion + TE_SetupBeamPoints(flStart, flEnd, g_iLightningModel, g_iLightningModel, 0, 1, 2.0, 5.0, 5.0, 1, 1.0, {255, 255, 255, 255}, 250); + TE_SendToAll(); + + TE_SetupExplosion(flEnd, g_iExplosionModel, 10.0, 10, TE_EXPLFLAG_NONE, 200, 255); + TE_SendToAll(); + + TE_SetupSmoke(flEnd, g_iExplosionModel, 50.0, 2); + TE_SendToAll(); + + TE_SetupSmoke(flEnd, g_iSmokeModel, 50.0, 2); + TE_SendToAll(); + + TE_SetupMetalSparks(flSparkPos, flSparkDir); + TE_SendToAll(); + + EmitAmbientSound("ambient/explosions/explode_8.wav", flEnd, SOUND_FROM_WORLD, SNDLEVEL_NORMAL, SND_NOFLAGS, 1.0, SNDPITCH_NORMAL, 0.0); +} diff --git a/addons/sourcemod/scripting/atac-drug.sp b/addons/sourcemod/scripting/atac-drug.sp index 1dc8317..93fd19e 100644 --- a/addons/sourcemod/scripting/atac-drug.sp +++ b/addons/sourcemod/scripting/atac-drug.sp @@ -1,103 +1,103 @@ -#pragma semicolon 1 - #include #include - #undef REQUIRE_PLUGIN #include -public Plugin:myinfo = +#pragma newdecls required +#pragma semicolon 1 + +public Plugin myinfo = { - name = "ATAC - Drug Punishment", - author = "GameConnect", - description = "Advanced Team Attack Control", - version = ATAC_VERSION, - url = "http://www.gameconnect.net" + name = "ATAC - Drug Punishment", + author = "GameConnect", + description = "Advanced Team Attack Control", + version = ATAC_VERSION, + url = "http://www.gameconnect.net" }; /** * Globals */ -new Float:g_flDrugAngles[] = {0.0, 5.0, 10.0, 15.0, 20.0, 25.0, 20.0, 15.0, 10.0, 5.0, 0.0, -5.0, -10.0, -15.0, -20.0, -25.0, -20.0, -15.0, -10.0, -5.0}; +float g_flDrugAngles[] = {0.0, 5.0, 10.0, 15.0, 20.0, 25.0, 20.0, 15.0, 10.0, 5.0, 0.0, -5.0, -10.0, -15.0, -20.0, -25.0, -20.0, -15.0, -10.0, -5.0}; /** * Plugin Forwards */ -public OnPluginStart() +public void OnPluginStart() { - // Load translations - LoadTranslations("atac-drug.phrases"); - - if(LibraryExists("atac")) - OnLibraryAdded("atac"); + // Load translations + LoadTranslations("atac-drug.phrases"); + + if (LibraryExists("atac")) { + OnLibraryAdded("atac"); + } } -public OnLibraryAdded(const String:name[]) +public void OnLibraryAdded(const char[] name) { - if(!StrEqual(name, "atac")) - return; - - decl String:sName[32]; - Format(sName, sizeof(sName), "%T", "Drug", LANG_SERVER); - ATAC_RegisterPunishment(sName, AtacPunishment_Drug); + if (!StrEqual(name, "atac")) { + return; + } + + char sName[32]; + Format(sName, sizeof(sName), "%T", "Drug", LANG_SERVER); + ATAC_RegisterPunishment(sName, AtacPunishment_Drug); } /** * ATAC Punishments */ -public AtacPunishment_Drug(victim, attacker) +public void AtacPunishment_Drug(int victim, int attacker) { - PrintToChatAll("%c[ATAC]%c %t", CLR_GREEN, CLR_DEFAULT, "Drugged", attacker, ATAC_GetInfo(attacker, AtacInfo_Kills), ATAC_GetSetting(AtacSetting_KillsLimit)); - - CreateTimer(1.0, Timer_Drug, attacker, TIMER_REPEAT); + PrintToChatAll("%c[ATAC]%c %t", CLR_GREEN, CLR_DEFAULT, "Drugged", attacker, ATAC_GetInfo(attacker, AtacInfo_Kills), ATAC_GetSetting(AtacSetting_KillsLimit)); + + CreateTimer(1.0, Timer_Drug, attacker, TIMER_REPEAT); } /** * Timers */ -public Action:Timer_Drug(Handle:timer, any:client) +public Action Timer_Drug(Handle timer, any client) { - if(!IsClientInGame(client) || !IsPlayerAlive(client)) - return Plugin_Stop; - - decl Float:flAngles[3], Float:flPos[3]; - GetClientEyeAngles(client, flAngles); - GetClientAbsOrigin(client, flPos); - - flAngles[2] = g_flDrugAngles[GetRandomInt(0, 100) % sizeof(g_flDrugAngles)]; - TeleportEntity(client, flPos, flAngles, NULL_VECTOR); - - new iDuration = 255; - new iHoldTime = 255; - new iFlags = 0x0002; - new iColor[4] = {0, 0, 0, 128}; - iColor[0] = GetRandomInt(0, 255); - iColor[1] = GetRandomInt(0, 255); - iColor[2] = GetRandomInt(0, 255); - - new Handle:hMessage = StartMessageOne("Fade", client); - if(GetUserMessageType() == UM_Protobuf) - { - PbSetInt(hMessage, "duration", iDuration); - PbSetInt(hMessage, "hold_time", iHoldTime); - PbSetInt(hMessage, "flags", iFlags); - PbSetColor(hMessage, "clr", iColor); - } - else - { - BfWriteShort(hMessage, iDuration); - BfWriteShort(hMessage, iHoldTime); - BfWriteShort(hMessage, iFlags); - BfWriteByte(hMessage, iColor[0]); - BfWriteByte(hMessage, iColor[1]); - BfWriteByte(hMessage, iColor[2]); - BfWriteByte(hMessage, iColor[3]); - } - EndMessage(); - - return Plugin_Continue; -} \ No newline at end of file + if (!IsClientInGame(client) || !IsPlayerAlive(client)) { + return Plugin_Stop; + } + + float flAngles[3], flPos[3]; + GetClientEyeAngles(client, flAngles); + GetClientAbsOrigin(client, flPos); + + flAngles[2] = g_flDrugAngles[GetRandomInt(0, 100) % sizeof(g_flDrugAngles)]; + TeleportEntity(client, flPos, flAngles, NULL_VECTOR); + + int iDuration = 255, + iHoldTime = 255, + iFlags = 0x0002, + iColor[4] = {0, 0, 0, 128}; + iColor[0] = GetRandomInt(0, 255); + iColor[1] = GetRandomInt(0, 255); + iColor[2] = GetRandomInt(0, 255); + + Handle hMessage = StartMessageOne("Fade", client); + if (GetUserMessageType() == UM_Protobuf) { + PbSetInt(hMessage, "duration", iDuration); + PbSetInt(hMessage, "hold_time", iHoldTime); + PbSetInt(hMessage, "flags", iFlags); + PbSetColor(hMessage, "clr", iColor); + } else { + BfWriteShort(hMessage, iDuration); + BfWriteShort(hMessage, iHoldTime); + BfWriteShort(hMessage, iFlags); + BfWriteByte(hMessage, iColor[0]); + BfWriteByte(hMessage, iColor[1]); + BfWriteByte(hMessage, iColor[2]); + BfWriteByte(hMessage, iColor[3]); + } + EndMessage(); + + return Plugin_Continue; +} diff --git a/addons/sourcemod/scripting/atac-fire.sp b/addons/sourcemod/scripting/atac-fire.sp index 8f9bf83..89fdbb5 100644 --- a/addons/sourcemod/scripting/atac-fire.sp +++ b/addons/sourcemod/scripting/atac-fire.sp @@ -1,161 +1,160 @@ -#pragma semicolon 1 - #include #include - #undef REQUIRE_PLUGIN #include +#pragma newdecls required +#pragma semicolon 1 + #define SOUND_BEEP "buttons/button17.wav" #define SOUND_BOOM "weapons/explode3.wav" #define SOUND_FINAL "weapons/cguard/charging.wav" -public Plugin:myinfo = +public Plugin myinfo = { - name = "ATAC - Fire Punishment", - author = "GameConnect", - description = "Advanced Team Attack Control", - version = ATAC_VERSION, - url = "http://www.gameconnect.net" + name = "ATAC - Fire Punishment", + author = "GameConnect", + description = "Advanced Team Attack Control", + version = ATAC_VERSION, + url = "http://www.gameconnect.net" }; /** * Globals */ -new g_iBeamSprite; -new g_iExplosionSprite; -new g_iFireBombTime[MAXPLAYERS + 1]; -new g_iGreyColor[4] = {128, 128, 128, 255}; -new g_iHaloSprite; -new g_iOrangeColor[4] = {255, 128, 0, 255}; -new g_iWhiteColor[4] = {255, 255, 255, 255}; -new Handle:g_hDuration; -new Handle:g_hTicks; +int g_iBeamSprite; +int g_iExplosionSprite; +int g_iFireBombTime[MAXPLAYERS + 1]; +int g_iGreyColor[4] = {128, 128, 128, 255}; +int g_iHaloSprite; +int g_iOrangeColor[4] = {255, 128, 0, 255}; +int g_iWhiteColor[4] = {255, 255, 255, 255}; +ConVar g_hDuration; +ConVar g_hTicks; /** * Plugin Forwards */ -public OnPluginStart() +public void OnPluginStart() { - // Create convars - g_hDuration = CreateConVar("atac_burn_duration", "20.0", "ATAC Burn Duration", FCVAR_PLUGIN); - g_hTicks = CreateConVar("atac_firebomb_ticks", "10", "ATAC FireBomb Ticks", FCVAR_PLUGIN); - - // Load translations - LoadTranslations("atac-fire.phrases"); - - if(LibraryExists("atac")) - OnLibraryAdded("atac"); + // Create convars + g_hDuration = CreateConVar("atac_burn_duration", "20.0", "ATAC Burn Duration"); + g_hTicks = CreateConVar("atac_firebomb_ticks", "10", "ATAC FireBomb Ticks"); + + // Load translations + LoadTranslations("atac-fire.phrases"); + + if (LibraryExists("atac")) { + OnLibraryAdded("atac"); + } } -public OnMapStart() +public void OnMapStart() { - g_iBeamSprite = PrecacheModel("materials/sprites/laser.vmt"); - g_iExplosionSprite = PrecacheModel("sprites/sprite_fire01.vmt"); - g_iHaloSprite = PrecacheModel("materials/sprites/halo01.vmt"); - - PrecacheSound(SOUND_BEEP, true); - PrecacheSound(SOUND_BOOM, true); - PrecacheSound(SOUND_FINAL, true); + g_iBeamSprite = PrecacheModel("materials/sprites/laser.vmt"); + g_iExplosionSprite = PrecacheModel("sprites/sprite_fire01.vmt"); + g_iHaloSprite = PrecacheModel("materials/sprites/halo01.vmt"); + + PrecacheSound(SOUND_BEEP, true); + PrecacheSound(SOUND_BOOM, true); + PrecacheSound(SOUND_FINAL, true); } -public OnLibraryAdded(const String:name[]) +public void OnLibraryAdded(const char[] name) { - if(!StrEqual(name, "atac")) - return; - - decl String:sName[32]; - Format(sName, sizeof(sName), "%T", "Burn", LANG_SERVER); - ATAC_RegisterPunishment(sName, AtacPunishment_Burn); - - Format(sName, sizeof(sName), "%T", "FireBomb", LANG_SERVER); - ATAC_RegisterPunishment(sName, AtacPunishment_FireBomb); + if (!StrEqual(name, "atac")) { + return; + } + + char sName[32]; + Format(sName, sizeof(sName), "%T", "Burn", LANG_SERVER); + ATAC_RegisterPunishment(sName, AtacPunishment_Burn); + + Format(sName, sizeof(sName), "%T", "FireBomb", LANG_SERVER); + ATAC_RegisterPunishment(sName, AtacPunishment_FireBomb); } /** * ATAC Punishments */ -public AtacPunishment_Burn(victim, attacker) +public void AtacPunishment_Burn(int victim, int attacker) { - PrintToChatAll("%c[ATAC]%c %t", CLR_GREEN, CLR_DEFAULT, "Burned", attacker, ATAC_GetInfo(attacker, AtacInfo_Kills), ATAC_GetSetting(AtacSetting_KillsLimit)); - - IgniteEntity(attacker, GetConVarFloat(g_hDuration)); + PrintToChatAll("%c[ATAC]%c %t", CLR_GREEN, CLR_DEFAULT, "Burned", attacker, ATAC_GetInfo(attacker, AtacInfo_Kills), ATAC_GetSetting(AtacSetting_KillsLimit)); + + IgniteEntity(attacker, g_hDuration.FloatValue); } -public AtacPunishment_FireBomb(victim, attacker) +public void AtacPunishment_FireBomb(int victim, int attacker) { - PrintToChatAll("%c[ATAC]%c %t", CLR_GREEN, CLR_DEFAULT, "FireBombed", attacker, ATAC_GetInfo(attacker, AtacInfo_Kills), ATAC_GetSetting(AtacSetting_KillsLimit)); - - g_iFireBombTime[attacker] = GetConVarInt(g_hTicks); - CreateTimer(1.0, Timer_FireBomb, attacker, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + PrintToChatAll("%c[ATAC]%c %t", CLR_GREEN, CLR_DEFAULT, "FireBombed", attacker, ATAC_GetInfo(attacker, AtacInfo_Kills), ATAC_GetSetting(AtacSetting_KillsLimit)); + + g_iFireBombTime[attacker] = g_hTicks.IntValue; + CreateTimer(1.0, Timer_FireBomb, attacker, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); } /** * Timers */ -public Action:Timer_FireBomb(Handle:timer, any:client) +public Action Timer_FireBomb(Handle timer, any client) { - if(!IsClientInGame(client) || !IsPlayerAlive(client)) - return Plugin_Stop; - - decl Float:flPos[3]; - GetClientEyePosition(client, flPos); - - if(--g_iFireBombTime[client]) - { - new iColor = 0; - if(g_iFireBombTime[client] == 1) - EmitAmbientSound(SOUND_FINAL, flPos, client, SNDLEVEL_RAIDSIREN); - else - { - iColor = RoundToFloor(g_iFireBombTime[client] * (255.0 / GetConVarInt(g_hTicks))); - EmitAmbientSound(SOUND_BEEP, flPos, client, SNDLEVEL_RAIDSIREN); - } - - SetEntityRenderColor(client, 255, iColor, iColor, 255); - PrintCenterTextAll("%t", "Till Explodes", g_iFireBombTime[client], client); - - GetClientAbsOrigin(client, flPos); - flPos[2] += 10; - - TE_SetupBeamRingPoint(flPos, 10.0, 200.0, g_iBeamSprite, g_iHaloSprite, 0, 15, 0.5, 5.0, 0.0, g_iGreyColor, 10, 0); - TE_SendToAll(); - TE_SetupBeamRingPoint(flPos, 10.0, 200.0, g_iBeamSprite, g_iHaloSprite, 0, 10, 0.6, 10.0, 0.5, g_iWhiteColor, 10, 0); - TE_SendToAll(); - - return Plugin_Continue; - } - else - { - TE_SetupExplosion(flPos, g_iExplosionSprite, 0.1, 1, 0, 600, 5000); - TE_SendToAll(); - - EmitAmbientSound(SOUND_BOOM, flPos, client, SNDLEVEL_RAIDSIREN); - GetClientAbsOrigin(client, flPos); - - flPos[2] += 10; - TE_SetupBeamRingPoint(flPos, 50.0, 600.0, g_iBeamSprite, g_iHaloSprite, 0, 10, 0.5, 30.0, 1.5, g_iOrangeColor, 5, 0); - TE_SendToAll(); - - flPos[2] += 15; - TE_SetupBeamRingPoint(flPos, 40.0, 600.0, g_iBeamSprite, g_iHaloSprite, 0, 10, 0.6, 30.0, 1.5, g_iOrangeColor, 5, 0); - TE_SendToAll(); - - flPos[2] += 15; - TE_SetupBeamRingPoint(flPos, 30.0, 600.0, g_iBeamSprite, g_iHaloSprite, 0, 10, 0.7, 30.0, 1.5, g_iOrangeColor, 5, 0); - TE_SendToAll(); - - flPos[2] += 15; - TE_SetupBeamRingPoint(flPos, 20.0, 600.0, g_iBeamSprite, g_iHaloSprite, 0, 10, 0.8, 30.0, 1.5, g_iOrangeColor, 5, 0); - TE_SendToAll(); - - IgniteEntity(client, GetConVarFloat(g_hDuration)); - SetEntityRenderColor(client, 255, 255, 255, 255); - - return Plugin_Stop; - } -} \ No newline at end of file + if (!IsClientInGame(client) || !IsPlayerAlive(client)) { + return Plugin_Stop; + } + + float flPos[3]; + GetClientEyePosition(client, flPos); + + if (--g_iFireBombTime[client]) { + int iColor = 0; + if (g_iFireBombTime[client] == 1) { + EmitAmbientSound(SOUND_FINAL, flPos, client, SNDLEVEL_RAIDSIREN); + } else { + iColor = RoundToFloor(g_iFireBombTime[client] * (255.0 / g_hTicks.IntValue)); + EmitAmbientSound(SOUND_BEEP, flPos, client, SNDLEVEL_RAIDSIREN); + } + + SetEntityRenderColor(client, 255, iColor, iColor, 255); + PrintCenterTextAll("%t", "Till Explodes", g_iFireBombTime[client], client); + + GetClientAbsOrigin(client, flPos); + flPos[2] += 10; + + TE_SetupBeamRingPoint(flPos, 10.0, 200.0, g_iBeamSprite, g_iHaloSprite, 0, 15, 0.5, 5.0, 0.0, g_iGreyColor, 10, 0); + TE_SendToAll(); + TE_SetupBeamRingPoint(flPos, 10.0, 200.0, g_iBeamSprite, g_iHaloSprite, 0, 10, 0.6, 10.0, 0.5, g_iWhiteColor, 10, 0); + TE_SendToAll(); + + return Plugin_Continue; + } else { + TE_SetupExplosion(flPos, g_iExplosionSprite, 0.1, 1, 0, 600, 5000); + TE_SendToAll(); + + EmitAmbientSound(SOUND_BOOM, flPos, client, SNDLEVEL_RAIDSIREN); + GetClientAbsOrigin(client, flPos); + + flPos[2] += 10; + TE_SetupBeamRingPoint(flPos, 50.0, 600.0, g_iBeamSprite, g_iHaloSprite, 0, 10, 0.5, 30.0, 1.5, g_iOrangeColor, 5, 0); + TE_SendToAll(); + + flPos[2] += 15; + TE_SetupBeamRingPoint(flPos, 40.0, 600.0, g_iBeamSprite, g_iHaloSprite, 0, 10, 0.6, 30.0, 1.5, g_iOrangeColor, 5, 0); + TE_SendToAll(); + + flPos[2] += 15; + TE_SetupBeamRingPoint(flPos, 30.0, 600.0, g_iBeamSprite, g_iHaloSprite, 0, 10, 0.7, 30.0, 1.5, g_iOrangeColor, 5, 0); + TE_SendToAll(); + + flPos[2] += 15; + TE_SetupBeamRingPoint(flPos, 20.0, 600.0, g_iBeamSprite, g_iHaloSprite, 0, 10, 0.8, 30.0, 1.5, g_iOrangeColor, 5, 0); + TE_SendToAll(); + + IgniteEntity(client, g_hDuration.FloatValue); + SetEntityRenderColor(client, 255, 255, 255, 255); + + return Plugin_Stop; + } +} diff --git a/addons/sourcemod/scripting/atac-freeze.sp b/addons/sourcemod/scripting/atac-freeze.sp index 6de499d..a3be9e9 100644 --- a/addons/sourcemod/scripting/atac-freeze.sp +++ b/addons/sourcemod/scripting/atac-freeze.sp @@ -1,189 +1,185 @@ -#pragma semicolon 1 - #include #include - #undef REQUIRE_PLUGIN #include +#pragma newdecls required +#pragma semicolon 1 #define SOUND_BEEP "buttons/button17.wav" #define SOUND_BOOM "weapons/explode3.wav" #define SOUND_FINAL "weapons/cguard/charging.wav" #define SOUND_FREEZE "physics/glass/glass_impact_bullet4.wav" -public Plugin:myinfo = +public Plugin myinfo = { - name = "ATAC - Freeze Punishment", - author = "GameConnect", - description = "Advanced Team Attack Control", - version = ATAC_VERSION, - url = "http://www.gameconnect.net" + name = "ATAC - Freeze Punishment", + author = "GameConnect", + description = "Advanced Team Attack Control", + version = ATAC_VERSION, + url = "http://www.gameconnect.net" }; /** * Globals */ -new g_iBeamSprite; -new g_iExplosionSprite; -new g_iFreezeBombTime[MAXPLAYERS + 1]; -new g_iGlowSprite; -new g_iGreyColor[4] = {128, 128, 128, 255}; -new g_iHaloSprite; -new g_iTime[MAXPLAYERS + 1]; -new g_iWhiteColor[4] = {255, 255, 255, 255}; -new Handle:g_hDuration; -new Handle:g_hTicks; +int g_iBeamSprite; +int g_iExplosionSprite; +int g_iFreezeBombTime[MAXPLAYERS + 1]; +int g_iGlowSprite; +int g_iGreyColor[4] = {128, 128, 128, 255}; +int g_iHaloSprite; +int g_iTime[MAXPLAYERS + 1]; +int g_iWhiteColor[4] = {255, 255, 255, 255}; +ConVar g_hDuration; +ConVar g_hTicks; /** * Plugin Forwards */ -public OnPluginStart() +public void OnPluginStart() { - // Create convars - g_hDuration = CreateConVar("atac_freeze_duration", "10", "ATAC Freeze Duration", FCVAR_PLUGIN); - g_hTicks = CreateConVar("atac_freezebomb_ticks", "10", "ATAC FreezeBomb Ticks", FCVAR_PLUGIN); - - // Load translations - LoadTranslations("atac-freeze.phrases"); - - if(LibraryExists("atac")) - OnLibraryAdded("atac"); + // Create convars + g_hDuration = CreateConVar("atac_freeze_duration", "10", "ATAC Freeze Duration"); + g_hTicks = CreateConVar("atac_freezebomb_ticks", "10", "ATAC FreezeBomb Ticks"); + + // Load translations + LoadTranslations("atac-freeze.phrases"); + + if (LibraryExists("atac")) { + OnLibraryAdded("atac"); + } } -public OnMapStart() +public void OnMapStart() { - g_iGlowSprite = PrecacheModel("sprites/blueglow2.vmt"); - - PrecacheSound(SOUND_BEEP, true); - PrecacheSound(SOUND_BOOM, true); - PrecacheSound(SOUND_FREEZE, true); - PrecacheSound(SOUND_FINAL, true); + g_iGlowSprite = PrecacheModel("sprites/blueglow2.vmt"); + + PrecacheSound(SOUND_BEEP, true); + PrecacheSound(SOUND_BOOM, true); + PrecacheSound(SOUND_FREEZE, true); + PrecacheSound(SOUND_FINAL, true); } -public OnLibraryAdded(const String:name[]) +public void OnLibraryAdded(const char[] name) { - if(!StrEqual(name, "atac")) - return; - - decl String:sName[32]; - Format(sName, sizeof(sName), "%T", "Freeze", LANG_SERVER); - ATAC_RegisterPunishment(sName, AtacPunishment_Freeze); - - Format(sName, sizeof(sName), "%T", "FreezeBomb", LANG_SERVER); - ATAC_RegisterPunishment(sName, AtacPunishment_FreezeBomb); + if (!StrEqual(name, "atac")) { + return; + } + + char sName[32]; + Format(sName, sizeof(sName), "%T", "Freeze", LANG_SERVER); + ATAC_RegisterPunishment(sName, AtacPunishment_Freeze); + + Format(sName, sizeof(sName), "%T", "FreezeBomb", LANG_SERVER); + ATAC_RegisterPunishment(sName, AtacPunishment_FreezeBomb); } /** * ATAC Punishments */ -public AtacPunishment_Freeze(victim, attacker) +public void AtacPunishment_Freeze(int victim, int attacker) { - PrintToChatAll("%c[ATAC]%c %t", CLR_GREEN, CLR_DEFAULT, "Frozen", attacker, ATAC_GetInfo(attacker, AtacInfo_Kills), ATAC_GetSetting(AtacSetting_KillsLimit)); - - SetEntityMoveType(attacker, MOVETYPE_NONE); - SetEntityRenderColor(attacker, 0, 128, 255, 192); - - decl Float:flPos[3]; - GetClientEyePosition(attacker, flPos); - EmitAmbientSound(SOUND_FREEZE, flPos, attacker, SNDLEVEL_RAIDSIREN); - - g_iTime[attacker] = GetConVarInt(g_hDuration); - CreateTimer(1.0, Timer_Freeze, attacker, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + PrintToChatAll("%c[ATAC]%c %t", CLR_GREEN, CLR_DEFAULT, "Frozen", attacker, ATAC_GetInfo(attacker, AtacInfo_Kills), ATAC_GetSetting(AtacSetting_KillsLimit)); + + SetEntityMoveType(attacker, MOVETYPE_NONE); + SetEntityRenderColor(attacker, 0, 128, 255, 192); + + float flPos[3]; + GetClientEyePosition(attacker, flPos); + EmitAmbientSound(SOUND_FREEZE, flPos, attacker, SNDLEVEL_RAIDSIREN); + + g_iTime[attacker] = g_hDuration.IntValue; + CreateTimer(1.0, Timer_Freeze, attacker, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); } -public AtacPunishment_FreezeBomb(victim, attacker) +public void AtacPunishment_FreezeBomb(int victim, int attacker) { - PrintToChatAll("%c[ATAC]%c %t", CLR_GREEN, CLR_DEFAULT, "FreezeBombed", attacker, ATAC_GetInfo(attacker, AtacInfo_Kills), ATAC_GetSetting(AtacSetting_KillsLimit)); - - g_iFreezeBombTime[attacker] = GetConVarInt(g_hTicks); - CreateTimer(1.0, Timer_FreezeBomb, attacker, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + PrintToChatAll("%c[ATAC]%c %t", CLR_GREEN, CLR_DEFAULT, "FreezeBombed", attacker, ATAC_GetInfo(attacker, AtacInfo_Kills), ATAC_GetSetting(AtacSetting_KillsLimit)); + + g_iFreezeBombTime[attacker] = g_hTicks.IntValue; + CreateTimer(1.0, Timer_FreezeBomb, attacker, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); } /** * Timers */ -public Action:Timer_Freeze(Handle:timer, any:client) +public Action Timer_Freeze(Handle timer, any client) { - if(!IsClientInGame(client) || !IsPlayerAlive(client)) - return Plugin_Stop; - - decl Float:flPos[3]; - if(--g_iTime[client]) - { - SetEntityMoveType(client, MOVETYPE_NONE); - SetEntityRenderColor(client, 0, 128, 255, 135); - - GetClientAbsOrigin(client, flPos); - flPos[2] += 10; - - TE_SetupGlowSprite(flPos, g_iGlowSprite, 0.95, 1.5, 50); - TE_SendToAll(); - - return Plugin_Continue; - } - else - { - GetClientEyePosition(client, flPos); - EmitAmbientSound(SOUND_FREEZE, flPos, client, SNDLEVEL_RAIDSIREN); - - SetEntityMoveType(client, MOVETYPE_WALK); - SetEntityRenderColor(client, 255, 255, 255, 255); - - return Plugin_Stop; - } + if (!IsClientInGame(client) || !IsPlayerAlive(client)) { + return Plugin_Stop; + } + + float flPos[3]; + if (--g_iTime[client]) { + SetEntityMoveType(client, MOVETYPE_NONE); + SetEntityRenderColor(client, 0, 128, 255, 135); + + GetClientAbsOrigin(client, flPos); + flPos[2] += 10; + + TE_SetupGlowSprite(flPos, g_iGlowSprite, 0.95, 1.5, 50); + TE_SendToAll(); + + return Plugin_Continue; + } else { + GetClientEyePosition(client, flPos); + EmitAmbientSound(SOUND_FREEZE, flPos, client, SNDLEVEL_RAIDSIREN); + + SetEntityMoveType(client, MOVETYPE_WALK); + SetEntityRenderColor(client, 255, 255, 255, 255); + + return Plugin_Stop; + } } -public Action:Timer_FreezeBomb(Handle:timer, any:client) +public Action Timer_FreezeBomb(Handle timer, any client) { - if(!IsClientInGame(client) || !IsPlayerAlive(client)) - return Plugin_Stop; - - decl Float:flPos[3]; - GetClientEyePosition(client, flPos); - - if(--g_iFreezeBombTime[client]) - { - new iColor = 0; - if(g_iFreezeBombTime[client] == 1) - EmitAmbientSound(SOUND_FINAL, flPos, client, SNDLEVEL_RAIDSIREN); - else - { - iColor = RoundToFloor(g_iFreezeBombTime[client] * (255.0 / GetConVarInt(g_hTicks))); - EmitAmbientSound(SOUND_BEEP, flPos, client, SNDLEVEL_RAIDSIREN); - } - - SetEntityRenderColor(client, 255, iColor, iColor, 255); - PrintCenterTextAll("%t", "Till Explodes", g_iFreezeBombTime[client], client); - - GetClientAbsOrigin(client, flPos); - flPos[2] += 10; - - TE_SetupBeamRingPoint(flPos, 10.0, 200.0, g_iBeamSprite, g_iHaloSprite, 0, 15, 0.5, 5.0, 0.0, g_iGreyColor, 10, 0); - TE_SendToAll(); - TE_SetupBeamRingPoint(flPos, 10.0, 200.0, g_iBeamSprite, g_iHaloSprite, 0, 10, 0.6, 10.0, 0.5, g_iWhiteColor, 10, 0); - TE_SendToAll(); - - return Plugin_Continue; - } - else - { - TE_SetupExplosion(flPos, g_iExplosionSprite, 0.1, 1, 0, 600, 5000); - TE_SendToAll(); - - EmitAmbientSound(SOUND_BOOM, flPos, client, SNDLEVEL_RAIDSIREN); - EmitAmbientSound(SOUND_FREEZE, flPos, client, SNDLEVEL_RAIDSIREN); - - SetEntityMoveType(client, MOVETYPE_NONE); - SetEntityRenderColor(client, 0, 128, 255, 192); - - g_iTime[client] = GetConVarInt(g_hDuration); - CreateTimer(1.0, Timer_Freeze, client, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); - - return Plugin_Stop; - } -} \ No newline at end of file + if (!IsClientInGame(client) || !IsPlayerAlive(client)) { + return Plugin_Stop; + } + + float flPos[3]; + GetClientEyePosition(client, flPos); + + if (--g_iFreezeBombTime[client]) { + int iColor = 0; + if (g_iFreezeBombTime[client] == 1) { + EmitAmbientSound(SOUND_FINAL, flPos, client, SNDLEVEL_RAIDSIREN); + } else { + iColor = RoundToFloor(g_iFreezeBombTime[client] * (255.0 / g_hTicks.IntValue)); + EmitAmbientSound(SOUND_BEEP, flPos, client, SNDLEVEL_RAIDSIREN); + } + + SetEntityRenderColor(client, 255, iColor, iColor, 255); + PrintCenterTextAll("%t", "Till Explodes", g_iFreezeBombTime[client], client); + + GetClientAbsOrigin(client, flPos); + flPos[2] += 10; + + TE_SetupBeamRingPoint(flPos, 10.0, 200.0, g_iBeamSprite, g_iHaloSprite, 0, 15, 0.5, 5.0, 0.0, g_iGreyColor, 10, 0); + TE_SendToAll(); + TE_SetupBeamRingPoint(flPos, 10.0, 200.0, g_iBeamSprite, g_iHaloSprite, 0, 10, 0.6, 10.0, 0.5, g_iWhiteColor, 10, 0); + TE_SendToAll(); + + return Plugin_Continue; + } else { + TE_SetupExplosion(flPos, g_iExplosionSprite, 0.1, 1, 0, 600, 5000); + TE_SendToAll(); + + EmitAmbientSound(SOUND_BOOM, flPos, client, SNDLEVEL_RAIDSIREN); + EmitAmbientSound(SOUND_FREEZE, flPos, client, SNDLEVEL_RAIDSIREN); + + SetEntityMoveType(client, MOVETYPE_NONE); + SetEntityRenderColor(client, 0, 128, 255, 192); + + g_iTime[client] = g_hDuration.IntValue; + CreateTimer(1.0, Timer_Freeze, client, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + + return Plugin_Stop; + } +} diff --git a/addons/sourcemod/scripting/atac-ins.sp b/addons/sourcemod/scripting/atac-ins.sp index f040a27..fe012e2 100644 --- a/addons/sourcemod/scripting/atac-ins.sp +++ b/addons/sourcemod/scripting/atac-ins.sp @@ -1,210 +1,218 @@ -#pragma semicolon 1 - #include #include - #undef REQUIRE_PLUGIN #include +#pragma newdecls required +#pragma semicolon 1 + #define SOUND_EXPLODE "ambient/explosions/explode_8.wav" -public Plugin:myinfo = +public Plugin myinfo = { - name = "ATAC - Insurgency Module", - author = "GameConnect", - description = "Advanced Team Attack Control", - version = ATAC_VERSION, - url = "http://www.gameconnect.net" + name = "ATAC - Insurgency Module", + author = "GameConnect", + description = "Advanced Team Attack Control", + version = ATAC_VERSION, + url = "http://www.gameconnect.net" }; /** * Globals */ -new g_iExplosionModel; -new g_iLightningModel; -new g_iSmokeModel; -new g_iSpawnTime[MAXPLAYERS + 1]; -new Handle:g_hHealDamage; -new Handle:g_hMirrorDamage; -new Handle:g_hMirrorDamageSlap; -new Handle:g_hPointCaptureKarma; -new Handle:g_hRoundWinKarma; -new Handle:g_hSpawnProtectTime; +int g_iExplosionModel; +int g_iLightningModel; +int g_iSmokeModel; +int g_iSpawnTime[MAXPLAYERS + 1]; +ConVar g_hHealDamage; +ConVar g_hMirrorDamage; +ConVar g_hMirrorDamageSlap; +ConVar g_hPointCaptureKarma; +ConVar g_hRoundWinKarma; +ConVar g_hSpawnProtectTime; /** * Plugin Forwards */ -public OnPluginStart() +public void OnPluginStart() { - decl String:sGameDir[64]; - GetGameFolderName(sGameDir, sizeof(sGameDir)); - if(!StrEqual(sGameDir, "insurgency")) - SetFailState("This plugin only works on Insurgency."); - - // Create convars - g_hHealDamage = CreateConVar("atac_heal_damage", "0", "ATAC Heal Damage", FCVAR_PLUGIN); - g_hMirrorDamage = CreateConVar("atac_mirrordamage", "1", "ATAC Mirror Damage", FCVAR_PLUGIN); - g_hMirrorDamageSlap = CreateConVar("atac_mirrordamage_slap", "0", "ATAC Mirror Damage Slap", FCVAR_PLUGIN); - g_hPointCaptureKarma = CreateConVar("atac_pointcapture_karma", "2", "ATAC Point Capture Karma", FCVAR_PLUGIN); - g_hRoundWinKarma = CreateConVar("atac_roundwin_karma", "2", "ATAC Round Win Karma", FCVAR_PLUGIN); - g_hSpawnProtectTime = CreateConVar("atac_spawnprotect_time", "10", "ATAC Spawn Protect Time", FCVAR_PLUGIN); - - // Hook events - HookEvent("player_hurt", Event_PlayerHurt); - HookEvent("player_spawn", Event_PlayerSpawn); - HookEvent("round_end", Event_RoundEnd); - - // Hook user messages - HookUserMessage(GetUserMessageId("ObjMsg"), UserMsg_ObjMsg); - - // Load translations - LoadTranslations("atac-ins.phrases"); + char sGameDir[64]; + GetGameFolderName(sGameDir, sizeof(sGameDir)); + if (!StrEqual(sGameDir, "insurgency")) { + SetFailState("This plugin only works on Insurgency."); + } + + // Create convars + g_hHealDamage = CreateConVar("atac_heal_damage", "0", "ATAC Heal Damage"); + g_hMirrorDamage = CreateConVar("atac_mirrordamage", "1", "ATAC Mirror Damage"); + g_hMirrorDamageSlap = CreateConVar("atac_mirrordamage_slap", "0", "ATAC Mirror Damage Slap"); + g_hPointCaptureKarma = CreateConVar("atac_pointcapture_karma", "2", "ATAC Point Capture Karma"); + g_hRoundWinKarma = CreateConVar("atac_roundwin_karma", "2", "ATAC Round Win Karma"); + g_hSpawnProtectTime = CreateConVar("atac_spawnprotect_time", "10", "ATAC Spawn Protect Time"); + + // Hook events + HookEvent("player_hurt", Event_PlayerHurt); + HookEvent("player_spawn", Event_PlayerSpawn); + HookEvent("round_end", Event_RoundEnd); + + // Hook user messages + HookUserMessage(GetUserMessageId("ObjMsg"), UserMsg_ObjMsg); + + // Load translations + LoadTranslations("atac-ins.phrases"); } -public OnMapStart() +public void OnMapStart() { - g_iExplosionModel = PrecacheModel("materials/effects/fire_cloud1.vmt"); - g_iLightningModel = PrecacheModel("materials/sprites/tp_beam001.vmt"); - g_iSmokeModel = PrecacheModel("materials/effects/fire_cloud2.vmt"); - - PrecacheSound(SOUND_EXPLODE, true); + g_iExplosionModel = PrecacheModel("materials/effects/fire_cloud1.vmt"); + g_iLightningModel = PrecacheModel("materials/sprites/tp_beam001.vmt"); + g_iSmokeModel = PrecacheModel("materials/effects/fire_cloud2.vmt"); + + PrecacheSound(SOUND_EXPLODE, true); } /** * Events */ -public Event_PlayerHurt(Handle:event, const String:name[], bool:dontBroadcast) +public void Event_PlayerHurt(Handle event, const char[] name, bool dontBroadcast) { - new iAttacker = GetClientOfUserId(GetEventInt(event, "attacker")), - iDamage = GetEventInt(event, "dmg_health"), - iVictim = GetClientOfUserId(GetEventInt(event, "userid")); - - if(!ATAC_GetSetting(AtacSetting_Enabled) || !iAttacker || iAttacker == iVictim || GetClientTeam(iAttacker) != GetClientTeam(iVictim)) - return; - - if(GetConVarBool(g_hHealDamage)) - SetEntityHealth(iVictim, GetClientHealth(iVictim) + iDamage); - - if(GetConVarBool(g_hMirrorDamage)) - { - new iHealth = GetClientHealth(iAttacker) - iDamage; - if(iHealth <= 0) - { - ForcePlayerSuicide(iAttacker); - return; - } - if(GetConVarBool(g_hMirrorDamageSlap)) - SlapPlayer(iAttacker, iDamage); - else - SetEntityHealth(iAttacker, iHealth); - } - - // If ignoring bots is enabled, and attacker or victim is a bot, ignore - if(ATAC_GetSetting(AtacSetting_IgnoreBots) && (IsFakeClient(iAttacker) || IsFakeClient(iVictim))) - return; - - // If immunity is enabled, and attacker has custom6 or root flag, ignore - if(ATAC_GetSetting(AtacSetting_Immunity) && GetUserFlagBits(iAttacker) & (ADMFLAG_CUSTOM6|ADMFLAG_ROOT)) - return; - - // If spawn protection is disabled, or the spawn protection has expired, ignore - new iProtectTime = GetConVarInt(g_hSpawnProtectTime); - if(!iProtectTime || GetTime() - g_iSpawnTime[iVictim] > iProtectTime) - return; - - PrintToChatAll("%c[ATAC]%c %t", CLR_GREEN, CLR_DEFAULT, "Spawn Attacking", iAttacker, iVictim); - SlayEffects(iAttacker); - ForcePlayerSuicide(iAttacker); + int iAttacker = GetClientOfUserId(GetEventInt(event, "attacker")), + iDamage = GetEventInt(event, "dmg_health"), + iVictim = GetClientOfUserId(GetEventInt(event, "userid")); + + if (!ATAC_GetSetting(AtacSetting_Enabled) || !iAttacker || iAttacker == iVictim || GetClientTeam(iAttacker) != GetClientTeam(iVictim)) { + return; + } + + if (g_hHealDamage.BoolValue) { + SetEntityHealth(iVictim, GetClientHealth(iVictim) + iDamage); + } + + if (g_hMirrorDamage.BoolValue) { + int iHealth = GetClientHealth(iAttacker) - iDamage; + if (iHealth <= 0) { + ForcePlayerSuicide(iAttacker); + return; + } + if (g_hMirrorDamageSlap.BoolValue) { + SlapPlayer(iAttacker, iDamage); + } else { + SetEntityHealth(iAttacker, iHealth); + } + } + + // If ignoring bots is enabled, and attacker or victim is a bot, ignore + if (ATAC_GetSetting(AtacSetting_IgnoreBots) && (IsFakeClient(iAttacker) || IsFakeClient(iVictim))) { + return; + } + + // If immunity is enabled, and attacker has custom6 or root flag, ignore + if (ATAC_GetSetting(AtacSetting_Immunity) && GetUserFlagBits(iAttacker) & (ADMFLAG_CUSTOM6|ADMFLAG_ROOT)) { + return; + } + + // If spawn protection is disabled, or the spawn protection has expired, ignore + int iProtectTime = g_hSpawnProtectTime.IntValue; + if (!iProtectTime || GetTime() - g_iSpawnTime[iVictim] > iProtectTime) { + return; + } + + PrintToChatAll("%c[ATAC]%c %t", CLR_GREEN, CLR_DEFAULT, "Spawn Attacking", iAttacker, iVictim); + SlayEffects(iAttacker); + ForcePlayerSuicide(iAttacker); } -public Event_PlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast) +public void Event_PlayerSpawn(Handle event, const char[] name, bool dontBroadcast) { - g_iSpawnTime[GetClientOfUserId(GetEventInt(event, "userid"))] = GetTime(); + g_iSpawnTime[GetClientOfUserId(GetEventInt(event, "userid"))] = GetTime(); } -public Event_RoundEnd(Handle:event, const String:name[], bool:dontBroadcast) +public void Event_RoundEnd(Handle event, const char[] name, bool dontBroadcast) { - if(!ATAC_GetSetting(AtacSetting_Enabled)) - return; - - decl String:sReason[256]; - new iKarma = GetConVarInt(g_hRoundWinKarma); - - for(new i = 1, iTeam = GetEventInt(event, "winner"); i <= MaxClients; i++) - { - if(!IsClientInGame(i) || GetClientTeam(i) != iTeam) - continue; - - Format(sReason, sizeof(sReason), "%T", "Winning Round", i); - ATAC_GiveKarma(i, iKarma, sReason); - } + if (!ATAC_GetSetting(AtacSetting_Enabled)) { + return; + } + + char sReason[256]; + int iKarma = g_hRoundWinKarma.IntValue; + + for (int i = 1, iTeam = GetEventInt(event, "winner"); i <= MaxClients; i++) { + if (!IsClientInGame(i) || GetClientTeam(i) != iTeam) { + continue; + } + + Format(sReason, sizeof(sReason), "%T", "Winning Round", i); + ATAC_GiveKarma(i, iKarma, sReason); + } } /** * User Messages */ -public Action:UserMsg_ObjMsg(UserMsg:msg_id, Handle:bf, const players[], playersNum, bool:reliable, bool:init) +public Action UserMsg_ObjMsg(UserMsg msg_id, Handle bf, const int[] players, int playersNum, bool reliable, bool init) { - if(!ATAC_GetSetting(AtacSetting_Enabled)) - return; - - // Objective Point: 1 = point A, 2 = point B, 3 = point C, etc. - BfReadByte(bf); - // Capture Status: 1 = starting capture, 2 = finished capture - if(BfReadByte(bf) != 2) - return; - - decl String:sReason[256]; - new iKarma = GetConVarInt(g_hPointCaptureKarma); - - for(new i = 1, iTeam = BfReadByte(bf); i <= MaxClients; i++) - { - if(!IsClientInGame(i) || GetClientTeam(i) != iTeam) - continue; - - Format(sReason, sizeof(sReason), "%T", "Capturing Point", i); - ATAC_GiveKarma(i, iKarma, sReason); - } + if (!ATAC_GetSetting(AtacSetting_Enabled)) { + return; + } + + // Objective Point: 1 = point A, 2 = point B, 3 = point C, etc. + BfReadByte(bf); + // Capture Status: 1 = starting capture, 2 = finished capture + if (BfReadByte(bf) != 2) { + return; + } + + char sReason[256]; + int iKarma = g_hPointCaptureKarma.IntValue; + + for (int i = 1, iTeam = BfReadByte(bf); i <= MaxClients; i++) { + if (!IsClientInGame(i) || GetClientTeam(i) != iTeam) { + continue; + } + + Format(sReason, sizeof(sReason), "%T", "Capturing Point", i); + ATAC_GiveKarma(i, iKarma, sReason); + } } /** * Stocks */ -stock SlayEffects(client) +void SlayEffects(int client) { - decl Float:flEnd[3], Float:flSparkDir[3], Float:flSparkPos[3], Float:flStart[3]; - // Get player position to use as the ending coordinates - GetClientAbsOrigin(client, flEnd); - - // Set the starting coordinates - flSparkDir = flEnd; - flSparkPos = flEnd; - flStart = flEnd; - - flSparkDir[2] += 23; - flSparkPos[2] += 13; - flStart[2] += 1000; - - // create lightning effects and sparks, and explosion - TE_SetupBeamPoints(flStart, flEnd, g_iLightningModel, g_iLightningModel, 0, 1, 2.0, 5.0, 5.0, 1, 1.0, {255, 255, 255, 255}, 250); - TE_SendToAll(); - - TE_SetupExplosion(flEnd, g_iExplosionModel, 10.0, 10, TE_EXPLFLAG_NONE, 200, 255); - TE_SendToAll(); - - TE_SetupSmoke(flEnd, g_iExplosionModel, 50.0, 2); - TE_SendToAll(); - - TE_SetupSmoke(flEnd, g_iSmokeModel, 50.0, 2); - TE_SendToAll(); - - TE_SetupMetalSparks(flSparkPos, flSparkDir); - TE_SendToAll(); - - EmitAmbientSound(SOUND_EXPLODE, flEnd, SOUND_FROM_WORLD, SNDLEVEL_NORMAL, SND_NOFLAGS, 1.0, SNDPITCH_NORMAL, 0.0); -} \ No newline at end of file + float flEnd[3], flSparkDir[3], flSparkPos[3], flStart[3]; + // Get player position to use as the ending coordinates + GetClientAbsOrigin(client, flEnd); + + // Set the starting coordinates + flSparkDir = flEnd; + flSparkPos = flEnd; + flStart = flEnd; + + flSparkDir[2] += 23; + flSparkPos[2] += 13; + flStart[2] += 1000; + + // create lightning effects and sparks, and explosion + TE_SetupBeamPoints(flStart, flEnd, g_iLightningModel, g_iLightningModel, 0, 1, 2.0, 5.0, 5.0, 1, 1.0, {255, 255, 255, 255}, 250); + TE_SendToAll(); + + TE_SetupExplosion(flEnd, g_iExplosionModel, 10.0, 10, TE_EXPLFLAG_NONE, 200, 255); + TE_SendToAll(); + + TE_SetupSmoke(flEnd, g_iExplosionModel, 50.0, 2); + TE_SendToAll(); + + TE_SetupSmoke(flEnd, g_iSmokeModel, 50.0, 2); + TE_SendToAll(); + + TE_SetupMetalSparks(flSparkPos, flSparkDir); + TE_SendToAll(); + + EmitAmbientSound(SOUND_EXPLODE, flEnd, SOUND_FROM_WORLD, SNDLEVEL_NORMAL, SND_NOFLAGS, 1.0, SNDPITCH_NORMAL, 0.0); +} diff --git a/addons/sourcemod/scripting/atac-ircrelay.sp b/addons/sourcemod/scripting/atac-ircrelay.sp index 7480cd5..382af3e 100644 --- a/addons/sourcemod/scripting/atac-ircrelay.sp +++ b/addons/sourcemod/scripting/atac-ircrelay.sp @@ -1,304 +1,290 @@ -#pragma semicolon 1 - #include #include - #undef REQUIRE_PLUGIN #include #include -public Plugin:myinfo = +#pragma newdecls required +#pragma semicolon 1 + +public Plugin myinfo = { - name = "ATAC - IRC Relay Module", - author = "GameConnect", - description = "Advanced Team Attack Control", - version = ATAC_VERSION, - url = "http://www.gameconnect.net" + name = "ATAC - IRC Relay Module", + author = "GameConnect", + description = "Advanced Team Attack Control", + version = ATAC_VERSION, + url = "http://www.gameconnect.net" }; /** * Globals */ -new Handle:g_hXsGetAttacks; -new Handle:g_hXsGetBans; -new Handle:g_hXsGetKarma; -new Handle:g_hXsGetKicks; -new Handle:g_hXsGetKills; -new Handle:g_hXsSetAttacks; -new Handle:g_hXsSetBans; -new Handle:g_hXsSetKarma; -new Handle:g_hXsSetKicks; -new Handle:g_hXsSetKills; -new Handle:g_hXsTKStatus; +ConVar g_hXsGetAttacks; +ConVar g_hXsGetBans; +ConVar g_hXsGetKarma; +ConVar g_hXsGetKicks; +ConVar g_hXsGetKills; +ConVar g_hXsSetAttacks; +ConVar g_hXsSetBans; +ConVar g_hXsSetKarma; +ConVar g_hXsSetKicks; +ConVar g_hXsSetKills; +ConVar g_hXsTKStatus; /** * Plugin Forwards */ -public OnPluginStart() +public void OnPluginStart() { - // Create convars - g_hXsGetAttacks = CreateConVar("atac_xs_getattacks", "", "Access level needed for getattacks command", FCVAR_PLUGIN); - g_hXsGetBans = CreateConVar("atac_xs_getbans", "", "Access level needed for getbans command", FCVAR_PLUGIN); - g_hXsGetKarma = CreateConVar("atac_xs_getkarma", "", "Access level needed for getkarma command", FCVAR_PLUGIN); - g_hXsGetKicks = CreateConVar("atac_xs_getkicks", "", "Access level needed for getkicks command", FCVAR_PLUGIN); - g_hXsGetKills = CreateConVar("atac_xs_getkills", "", "Access level needed for getkills command", FCVAR_PLUGIN); - g_hXsSetAttacks = CreateConVar("atac_xs_setattacks", "o", "Access level needed for setattacks command", FCVAR_PLUGIN); - g_hXsSetBans = CreateConVar("atac_xs_setbans", "o", "Access level needed for setbans command", FCVAR_PLUGIN); - g_hXsSetKarma = CreateConVar("atac_xs_setkarma", "o", "Access level needed for setkarma command", FCVAR_PLUGIN); - g_hXsSetKicks = CreateConVar("atac_xs_setkicks", "o", "Access level needed for setkicks command", FCVAR_PLUGIN); - g_hXsSetKills = CreateConVar("atac_xs_setkills", "o", "Access level needed for setkills command", FCVAR_PLUGIN); - g_hXsTKStatus = CreateConVar("atac_xs_tkstatus", "", "Access level needed for tkstatus command", FCVAR_PLUGIN); - - // Hook convar changes - HookConVarChange(g_hXsGetAttacks, ConVarChanged_ConVars); - HookConVarChange(g_hXsGetBans, ConVarChanged_ConVars); - HookConVarChange(g_hXsGetKarma, ConVarChanged_ConVars); - HookConVarChange(g_hXsGetKicks, ConVarChanged_ConVars); - HookConVarChange(g_hXsGetKills, ConVarChanged_ConVars); - HookConVarChange(g_hXsSetAttacks, ConVarChanged_ConVars); - HookConVarChange(g_hXsSetBans, ConVarChanged_ConVars); - HookConVarChange(g_hXsSetKarma, ConVarChanged_ConVars); - HookConVarChange(g_hXsSetKicks, ConVarChanged_ConVars); - HookConVarChange(g_hXsSetKills, ConVarChanged_ConVars); - HookConVarChange(g_hXsTKStatus, ConVarChanged_ConVars); - - // Load translations - LoadTranslations("common.phrases"); - LoadTranslations("atac-ircrelay.phrases"); - - if(LibraryExists("ircrelay")) - OnLibraryAdded("ircrelay"); + // Create convars + g_hXsGetAttacks = CreateConVar("atac_xs_getattacks", "", "Access level needed for getattacks command"); + g_hXsGetBans = CreateConVar("atac_xs_getbans", "", "Access level needed for getbans command"); + g_hXsGetKarma = CreateConVar("atac_xs_getkarma", "", "Access level needed for getkarma command"); + g_hXsGetKicks = CreateConVar("atac_xs_getkicks", "", "Access level needed for getkicks command"); + g_hXsGetKills = CreateConVar("atac_xs_getkills", "", "Access level needed for getkills command"); + g_hXsSetAttacks = CreateConVar("atac_xs_setattacks", "o", "Access level needed for setattacks command"); + g_hXsSetBans = CreateConVar("atac_xs_setbans", "o", "Access level needed for setbans command"); + g_hXsSetKarma = CreateConVar("atac_xs_setkarma", "o", "Access level needed for setkarma command"); + g_hXsSetKicks = CreateConVar("atac_xs_setkicks", "o", "Access level needed for setkicks command"); + g_hXsSetKills = CreateConVar("atac_xs_setkills", "o", "Access level needed for setkills command"); + g_hXsTKStatus = CreateConVar("atac_xs_tkstatus", "", "Access level needed for tkstatus command"); + + // Hook convar changes + g_hXsGetAttacks.AddChangeHook(ConVarChanged_ConVars); + g_hXsGetBans.AddChangeHook(ConVarChanged_ConVars); + g_hXsGetKarma.AddChangeHook(ConVarChanged_ConVars); + g_hXsGetKicks.AddChangeHook(ConVarChanged_ConVars); + g_hXsGetKills.AddChangeHook(ConVarChanged_ConVars); + g_hXsSetAttacks.AddChangeHook(ConVarChanged_ConVars); + g_hXsSetBans.AddChangeHook(ConVarChanged_ConVars); + g_hXsSetKarma.AddChangeHook(ConVarChanged_ConVars); + g_hXsSetKicks.AddChangeHook(ConVarChanged_ConVars); + g_hXsSetKills.AddChangeHook(ConVarChanged_ConVars); + g_hXsTKStatus.AddChangeHook(ConVarChanged_ConVars); + + // Load translations + LoadTranslations("common.phrases"); + LoadTranslations("atac-ircrelay.phrases"); + + if (LibraryExists("ircrelay")) { + OnLibraryAdded("ircrelay"); + } } -public OnLibraryAdded(const String:name[]) +public void OnLibraryAdded(const char[] name) { - if(!StrEqual(name, "ircrelay")) - return; - - decl String:sXsGetAttacks[2], String:sXsGetBans[2], String:sXsGetKarma[2], String:sXsGetKicks[2], String:sXsGetKills[2], - String:sXsSetAttacks[2], String:sXsSetBans[2], String:sXsSetKarma[2], String:sXsSetKicks[2], String:sXsSetKills[2], String:sXsTKStatus[2]; - GetConVarString(g_hXsGetAttacks, sXsGetAttacks, sizeof(sXsGetAttacks)); - GetConVarString(g_hXsGetBans, sXsGetBans, sizeof(sXsGetBans)); - GetConVarString(g_hXsGetKarma, sXsGetKarma, sizeof(sXsGetKarma)); - GetConVarString(g_hXsGetKicks, sXsGetKicks, sizeof(sXsGetKicks)); - GetConVarString(g_hXsGetKills, sXsGetKills, sizeof(sXsGetKills)); - GetConVarString(g_hXsSetAttacks, sXsSetAttacks, sizeof(sXsSetAttacks)); - GetConVarString(g_hXsSetBans, sXsSetBans, sizeof(sXsSetBans)); - GetConVarString(g_hXsSetKarma, sXsSetKarma, sizeof(sXsSetKarma)); - GetConVarString(g_hXsSetKicks, sXsSetKicks, sizeof(sXsSetKicks)); - GetConVarString(g_hXsSetKills, sXsSetKills, sizeof(sXsSetKills)); - GetConVarString(g_hXsTKStatus, sXsTKStatus, sizeof(sXsTKStatus)); - - IRC_RegisterCommand("getattacks", IrcCommand_GetAttacks, IRC_GetAccess(sXsGetAttacks)); - IRC_RegisterCommand("getbans", IrcCommand_GetBans, IRC_GetAccess(sXsGetBans)); - IRC_RegisterCommand("getkarma", IrcCommand_GetKarma, IRC_GetAccess(sXsGetKarma)); - IRC_RegisterCommand("getkicks", IrcCommand_GetKicks, IRC_GetAccess(sXsGetKicks)); - IRC_RegisterCommand("getkills", IrcCommand_GetKills, IRC_GetAccess(sXsGetKills)); - IRC_RegisterCommand("setattacks", IrcCommand_SetAttacks, IRC_GetAccess(sXsSetAttacks)); - IRC_RegisterCommand("setbans", IrcCommand_SetBans, IRC_GetAccess(sXsSetBans)); - IRC_RegisterCommand("setkarma", IrcCommand_SetKarma, IRC_GetAccess(sXsSetKarma)); - IRC_RegisterCommand("setkicks", IrcCommand_SetKicks, IRC_GetAccess(sXsSetKicks)); - IRC_RegisterCommand("setkills", IrcCommand_SetKills, IRC_GetAccess(sXsSetKills)); - IRC_RegisterCommand("tkstatus", IrcCommand_TKStatus, IRC_GetAccess(sXsTKStatus)); + if (!StrEqual(name, "ircrelay")) { + return; + } + + char sXsGetAttacks[2], sXsGetBans[2], sXsGetKarma[2], sXsGetKicks[2], sXsGetKills[2], + sXsSetAttacks[2], sXsSetBans[2], sXsSetKarma[2], sXsSetKicks[2], sXsSetKills[2], sXsTKStatus[2]; + g_hXsGetAttacks.GetString(sXsGetAttacks, sizeof(sXsGetAttacks)); + g_hXsGetBans.GetString(sXsGetBans, sizeof(sXsGetBans)); + g_hXsGetKarma.GetString(sXsGetKarma, sizeof(sXsGetKarma)); + g_hXsGetKicks.GetString(sXsGetKicks, sizeof(sXsGetKicks)); + g_hXsGetKills.GetString(sXsGetKills, sizeof(sXsGetKills)); + g_hXsSetAttacks.GetString(sXsSetAttacks, sizeof(sXsSetAttacks)); + g_hXsSetBans.GetString(sXsSetBans, sizeof(sXsSetBans)); + g_hXsSetKarma.GetString(sXsSetKarma, sizeof(sXsSetKarma)); + g_hXsSetKicks.GetString(sXsSetKicks, sizeof(sXsSetKicks)); + g_hXsSetKills.GetString(sXsSetKills, sizeof(sXsSetKills)); + g_hXsTKStatus.GetString(sXsTKStatus, sizeof(sXsTKStatus)); + + IRC_RegisterCommand("getattacks", IrcCommand_GetAttacks, IRC_GetAccess(sXsGetAttacks)); + IRC_RegisterCommand("getbans", IrcCommand_GetBans, IRC_GetAccess(sXsGetBans)); + IRC_RegisterCommand("getkarma", IrcCommand_GetKarma, IRC_GetAccess(sXsGetKarma)); + IRC_RegisterCommand("getkicks", IrcCommand_GetKicks, IRC_GetAccess(sXsGetKicks)); + IRC_RegisterCommand("getkills", IrcCommand_GetKills, IRC_GetAccess(sXsGetKills)); + IRC_RegisterCommand("setattacks", IrcCommand_SetAttacks, IRC_GetAccess(sXsSetAttacks)); + IRC_RegisterCommand("setbans", IrcCommand_SetBans, IRC_GetAccess(sXsSetBans)); + IRC_RegisterCommand("setkarma", IrcCommand_SetKarma, IRC_GetAccess(sXsSetKarma)); + IRC_RegisterCommand("setkicks", IrcCommand_SetKicks, IRC_GetAccess(sXsSetKicks)); + IRC_RegisterCommand("setkills", IrcCommand_SetKills, IRC_GetAccess(sXsSetKills)); + IRC_RegisterCommand("tkstatus", IrcCommand_TKStatus, IRC_GetAccess(sXsTKStatus)); } -public ConVarChanged_ConVars(Handle:convar, const String:oldValue[], const String:newValue[]) +public void ConVarChanged_ConVars(ConVar convar, const char[] oldValue, const char[] newValue) { - OnLibraryAdded("ircrelay"); + OnLibraryAdded("ircrelay"); } /** * IRC Commands */ -public IrcCommand_GetAttacks(const String:channel[], const String:name[], const String:arg[]) +public void IrcCommand_GetAttacks(const char[] channel, const char[] name, const char[] arg) { - new iTarget = FindTarget(0, arg); - if(iTarget == -1) - { - IRC_PrivMsg(channel, "Invalid player specified."); - return; - } - - decl String:sName[MAX_NAME_LENGTH + 1]; - IRC_GetClientName(iTarget, sName, sizeof(sName)); - - IRC_PrivMsg(channel, "[ATAC] %t", "IRC TA Count", sName, ATAC_GetInfo(iTarget, AtacInfo_Attacks), ATAC_GetSetting(AtacSetting_AttacksLimit)); + int iTarget = FindTarget(0, arg); + if (iTarget == -1) { + IRC_PrivMsg(channel, "Invalid player specified."); + return; + } + + char sName[MAX_NAME_LENGTH + 1]; + IRC_GetClientName(iTarget, sName, sizeof(sName)); + + IRC_PrivMsg(channel, "[ATAC] %t", "IRC TA Count", sName, ATAC_GetInfo(iTarget, AtacInfo_Attacks), ATAC_GetSetting(AtacSetting_AttacksLimit)); } -public IrcCommand_GetBans(const String:channel[], const String:name[], const String:arg[]) +public void IrcCommand_GetBans(const char[] channel, const char[] name, const char[] arg) { - new iTarget = FindTarget(0, arg); - if(iTarget == -1) - { - IRC_PrivMsg(channel, "Invalid player specified."); - return; - } - - decl String:sName[MAX_NAME_LENGTH + 1]; - IRC_GetClientName(iTarget, sName, sizeof(sName)); - - IRC_PrivMsg(channel, "[ATAC] %t", "IRC Ban Count", sName, ATAC_GetInfo(iTarget, AtacInfo_Bans), ATAC_GetSetting(AtacSetting_BansLimit)); + int iTarget = FindTarget(0, arg); + if (iTarget == -1) { + IRC_PrivMsg(channel, "Invalid player specified."); + return; + } + + char sName[MAX_NAME_LENGTH + 1]; + IRC_GetClientName(iTarget, sName, sizeof(sName)); + + IRC_PrivMsg(channel, "[ATAC] %t", "IRC Ban Count", sName, ATAC_GetInfo(iTarget, AtacInfo_Bans), ATAC_GetSetting(AtacSetting_BansLimit)); } -public IrcCommand_GetKarma(const String:channel[], const String:name[], const String:arg[]) +public void IrcCommand_GetKarma(const char[] channel, const char[] name, const char[] arg) { - new iTarget = FindTarget(0, arg); - if(iTarget == -1) - { - IRC_PrivMsg(channel, "Invalid player specified."); - return; - } - - decl String:sName[MAX_NAME_LENGTH + 1]; - IRC_GetClientName(iTarget, sName, sizeof(sName)); - - IRC_PrivMsg(channel, "[ATAC] %t", "IRC Karma Count", sName, ATAC_GetInfo(iTarget, AtacInfo_Karma), ATAC_GetSetting(AtacSetting_KarmaLimit)); + int iTarget = FindTarget(0, arg); + if (iTarget == -1) { + IRC_PrivMsg(channel, "Invalid player specified."); + return; + } + + char sName[MAX_NAME_LENGTH + 1]; + IRC_GetClientName(iTarget, sName, sizeof(sName)); + + IRC_PrivMsg(channel, "[ATAC] %t", "IRC Karma Count", sName, ATAC_GetInfo(iTarget, AtacInfo_Karma), ATAC_GetSetting(AtacSetting_KarmaLimit)); } -public IrcCommand_GetKicks(const String:channel[], const String:name[], const String:arg[]) +public void IrcCommand_GetKicks(const char[] channel, const char[] name, const char[] arg) { - new iTarget = FindTarget(0, arg); - if(iTarget == -1) - { - IRC_PrivMsg(channel, "Invalid player specified."); - return; - } - - decl String:sName[MAX_NAME_LENGTH + 1]; - IRC_GetClientName(iTarget, sName, sizeof(sName)); - - IRC_PrivMsg(channel, "[ATAC] %t", "IRC Kick Count", sName, ATAC_GetInfo(iTarget, AtacInfo_Kicks), ATAC_GetSetting(AtacSetting_KicksLimit)); + int iTarget = FindTarget(0, arg); + if (iTarget == -1) { + IRC_PrivMsg(channel, "Invalid player specified."); + return; + } + + char sName[MAX_NAME_LENGTH + 1]; + IRC_GetClientName(iTarget, sName, sizeof(sName)); + + IRC_PrivMsg(channel, "[ATAC] %t", "IRC Kick Count", sName, ATAC_GetInfo(iTarget, AtacInfo_Kicks), ATAC_GetSetting(AtacSetting_KicksLimit)); } -public IrcCommand_GetKills(const String:channel[], const String:name[], const String:arg[]) +public void IrcCommand_GetKills(const char[] channel, const char[] name, const char[] arg) { - new iTarget = FindTarget(0, arg); - if(iTarget == -1) - { - IRC_PrivMsg(channel, "Invalid player specified."); - return; - } - - decl String:sName[MAX_NAME_LENGTH + 1]; - IRC_GetClientName(iTarget, sName, sizeof(sName)); - - IRC_PrivMsg(channel, "[ATAC] %t", "IRC TK Count", sName, ATAC_GetInfo(iTarget, AtacInfo_Kills), ATAC_GetSetting(AtacSetting_KillsLimit)); + int iTarget = FindTarget(0, arg); + if (iTarget == -1) { + IRC_PrivMsg(channel, "Invalid player specified."); + return; + } + + char sName[MAX_NAME_LENGTH + 1]; + IRC_GetClientName(iTarget, sName, sizeof(sName)); + + IRC_PrivMsg(channel, "[ATAC] %t", "IRC TK Count", sName, ATAC_GetInfo(iTarget, AtacInfo_Kills), ATAC_GetSetting(AtacSetting_KillsLimit)); } -public IrcCommand_SetAttacks(const String:channel[], const String:name[], const String:arg[]) +public void IrcCommand_SetAttacks(const char[] channel, const char[] name, const char[] arg) { - decl String:sTarget[MAX_NAME_LENGTH + 1]; - new iLen = BreakString(arg, sTarget, sizeof(sTarget)), - iTarget = FindTarget(0, sTarget); - - if(iTarget == -1) - { - IRC_PrivMsg(channel, "Invalid player specified."); - return; - } - - decl String:sName[MAX_NAME_LENGTH + 1]; - IRC_GetClientName(iTarget, sName, sizeof(sName)); - - ATAC_SetInfo(iTarget, AtacInfo_Attacks, StringToInt(arg[iLen])); - IRC_PrivMsg(channel, "[ATAC] %t", "IRC Set TA", sName, StringToInt(arg[iLen]), ATAC_GetSetting(AtacSetting_AttacksLimit)); + char sName[MAX_NAME_LENGTH + 1], sTarget[MAX_NAME_LENGTH + 1]; + int iLen = BreakString(arg, sTarget, sizeof(sTarget)), + iTarget = FindTarget(0, sTarget); + + if (iTarget == -1) { + IRC_PrivMsg(channel, "Invalid player specified."); + return; + } + + IRC_GetClientName(iTarget, sName, sizeof(sName)); + + ATAC_SetInfo(iTarget, AtacInfo_Attacks, StringToInt(arg[iLen])); + IRC_PrivMsg(channel, "[ATAC] %t", "IRC Set TA", sName, StringToInt(arg[iLen]), ATAC_GetSetting(AtacSetting_AttacksLimit)); } -public IrcCommand_SetBans(const String:channel[], const String:name[], const String:arg[]) +public void IrcCommand_SetBans(const char[] channel, const char[] name, const char[] arg) { - decl String:sTarget[MAX_NAME_LENGTH + 1]; - new iLen = BreakString(arg, sTarget, sizeof(sTarget)), - iTarget = FindTarget(0, sTarget); - - if(iTarget == -1) - { - IRC_PrivMsg(channel, "Invalid player specified."); - return; - } - - decl String:sName[MAX_NAME_LENGTH + 1]; - IRC_GetClientName(iTarget, sName, sizeof(sName)); - - ATAC_SetInfo(iTarget, AtacInfo_Bans, StringToInt(arg[iLen])); - IRC_PrivMsg(channel, "[ATAC] %t", "IRC Set Bans", sName, StringToInt(arg[iLen]), ATAC_GetSetting(AtacSetting_BansLimit)); + char sName[MAX_NAME_LENGTH + 1], sTarget[MAX_NAME_LENGTH + 1]; + int iLen = BreakString(arg, sTarget, sizeof(sTarget)), + iTarget = FindTarget(0, sTarget); + + if (iTarget == -1) { + IRC_PrivMsg(channel, "Invalid player specified."); + return; + } + + IRC_GetClientName(iTarget, sName, sizeof(sName)); + + ATAC_SetInfo(iTarget, AtacInfo_Bans, StringToInt(arg[iLen])); + IRC_PrivMsg(channel, "[ATAC] %t", "IRC Set Bans", sName, StringToInt(arg[iLen]), ATAC_GetSetting(AtacSetting_BansLimit)); } -public IrcCommand_SetKarma(const String:channel[], const String:name[], const String:arg[]) +public void IrcCommand_SetKarma(const char[] channel, const char[] name, const char[] arg) { - decl String:sTarget[MAX_NAME_LENGTH + 1]; - new iLen = BreakString(arg, sTarget, sizeof(sTarget)), - iTarget = FindTarget(0, sTarget); - - if(iTarget == -1) - { - IRC_PrivMsg(channel, "Invalid player specified."); - return; - } - - decl String:sName[MAX_NAME_LENGTH + 1]; - IRC_GetClientName(iTarget, sName, sizeof(sName)); - - ATAC_SetInfo(iTarget, AtacInfo_Karma, StringToInt(arg[iLen])); - IRC_PrivMsg(channel, "[ATAC] %t", "IRC Set Karma", sName, StringToInt(arg[iLen]), ATAC_GetSetting(AtacSetting_KarmaLimit)); + char sName[MAX_NAME_LENGTH + 1], sTarget[MAX_NAME_LENGTH + 1]; + int iLen = BreakString(arg, sTarget, sizeof(sTarget)), + iTarget = FindTarget(0, sTarget); + + if (iTarget == -1) { + IRC_PrivMsg(channel, "Invalid player specified."); + return; + } + + IRC_GetClientName(iTarget, sName, sizeof(sName)); + + ATAC_SetInfo(iTarget, AtacInfo_Karma, StringToInt(arg[iLen])); + IRC_PrivMsg(channel, "[ATAC] %t", "IRC Set Karma", sName, StringToInt(arg[iLen]), ATAC_GetSetting(AtacSetting_KarmaLimit)); } -public IrcCommand_SetKicks(const String:channel[], const String:name[], const String:arg[]) +public void IrcCommand_SetKicks(const char[] channel, const char[] name, const char[] arg) { - decl String:sTarget[MAX_NAME_LENGTH + 1]; - new iLen = BreakString(arg, sTarget, sizeof(sTarget)), - iTarget = FindTarget(0, sTarget); - - if(iTarget == -1) - { - IRC_PrivMsg(channel, "Invalid player specified."); - return; - } - - decl String:sName[MAX_NAME_LENGTH + 1]; - IRC_GetClientName(iTarget, sName, sizeof(sName)); - - ATAC_SetInfo(iTarget, AtacInfo_Kicks, StringToInt(arg[iLen])); - IRC_PrivMsg(channel, "[ATAC] %t", "IRC Set Kicks", sName, StringToInt(arg[iLen]), ATAC_GetSetting(AtacSetting_KicksLimit)); + char sName[MAX_NAME_LENGTH + 1], sTarget[MAX_NAME_LENGTH + 1]; + int iLen = BreakString(arg, sTarget, sizeof(sTarget)), + iTarget = FindTarget(0, sTarget); + + if (iTarget == -1) { + IRC_PrivMsg(channel, "Invalid player specified."); + return; + } + + IRC_GetClientName(iTarget, sName, sizeof(sName)); + + ATAC_SetInfo(iTarget, AtacInfo_Kicks, StringToInt(arg[iLen])); + IRC_PrivMsg(channel, "[ATAC] %t", "IRC Set Kicks", sName, StringToInt(arg[iLen]), ATAC_GetSetting(AtacSetting_KicksLimit)); } -public IrcCommand_SetKills(const String:channel[], const String:name[], const String:arg[]) +public void IrcCommand_SetKills(const char[] channel, const char[] name, const char[] arg) { - decl String:sTarget[MAX_NAME_LENGTH + 1]; - new iLen = BreakString(arg, sTarget, sizeof(sTarget)), - iTarget = FindTarget(0, sTarget); - - if(iTarget == -1) - { - IRC_PrivMsg(channel, "Invalid player specified."); - return; - } - - decl String:sName[MAX_NAME_LENGTH + 1]; - IRC_GetClientName(iTarget, sName, sizeof(sName)); - - ATAC_SetInfo(iTarget, AtacInfo_Kills, StringToInt(arg[iLen])); - IRC_PrivMsg(channel, "[ATAC] %t", "IRC Set TK", sName, StringToInt(arg[iLen]), ATAC_GetSetting(AtacSetting_KillsLimit)); + char sName[MAX_NAME_LENGTH + 1], sTarget[MAX_NAME_LENGTH + 1]; + int iLen = BreakString(arg, sTarget, sizeof(sTarget)), + iTarget = FindTarget(0, sTarget); + + if (iTarget == -1) { + IRC_PrivMsg(channel, "Invalid player specified."); + return; + } + + IRC_GetClientName(iTarget, sName, sizeof(sName)); + + ATAC_SetInfo(iTarget, AtacInfo_Kills, StringToInt(arg[iLen])); + IRC_PrivMsg(channel, "[ATAC] %t", "IRC Set TK", sName, StringToInt(arg[iLen]), ATAC_GetSetting(AtacSetting_KillsLimit)); } -public IrcCommand_TKStatus(const String:channel[], const String:name[], const String:arg[]) +public void IrcCommand_TKStatus(const char[] channel, const char[] name, const char[] arg) { - new iTarget = FindTarget(0, arg); - if(iTarget == -1) - { - IRC_PrivMsg(channel, "Invalid player specified."); - return; - } - - decl String:sName[MAX_NAME_LENGTH + 1]; - IRC_GetClientName(iTarget, sName, sizeof(sName)); - - IRC_PrivMsg(channel, "[ATAC] %T", "IRC TK Status Title", LANG_SERVER, sName); - IRC_PrivMsg(channel, "[ATAC] %T", "IRC Karma Count", LANG_SERVER, sName, ATAC_GetInfo(iTarget, AtacInfo_Karma), ATAC_GetSetting(AtacSetting_KarmaLimit)); - IRC_PrivMsg(channel, "[ATAC] %T", "IRC TA Count", LANG_SERVER, sName, ATAC_GetInfo(iTarget, AtacInfo_Attacks), ATAC_GetSetting(AtacSetting_AttacksLimit)); - IRC_PrivMsg(channel, "[ATAC] %T", "IRC TK Count", LANG_SERVER, sName, ATAC_GetInfo(iTarget, AtacInfo_Kills), ATAC_GetSetting(AtacSetting_KillsLimit)); - IRC_PrivMsg(channel, "[ATAC] %T", "IRC Kick Count", LANG_SERVER, sName, ATAC_GetInfo(iTarget, AtacInfo_Kicks), ATAC_GetSetting(AtacSetting_KicksLimit)); - IRC_PrivMsg(channel, "[ATAC] %T", "IRC Ban Count", LANG_SERVER, sName, ATAC_GetInfo(iTarget, AtacInfo_Bans), ATAC_GetSetting(AtacSetting_BansLimit)); -} \ No newline at end of file + int iTarget = FindTarget(0, arg); + if (iTarget == -1) { + IRC_PrivMsg(channel, "Invalid player specified."); + return; + } + + char sName[MAX_NAME_LENGTH + 1]; + IRC_GetClientName(iTarget, sName, sizeof(sName)); + + IRC_PrivMsg(channel, "[ATAC] %T", "IRC TK Status Title", LANG_SERVER, sName); + IRC_PrivMsg(channel, "[ATAC] %T", "IRC Karma Count", LANG_SERVER, sName, ATAC_GetInfo(iTarget, AtacInfo_Karma), ATAC_GetSetting(AtacSetting_KarmaLimit)); + IRC_PrivMsg(channel, "[ATAC] %T", "IRC TA Count", LANG_SERVER, sName, ATAC_GetInfo(iTarget, AtacInfo_Attacks), ATAC_GetSetting(AtacSetting_AttacksLimit)); + IRC_PrivMsg(channel, "[ATAC] %T", "IRC TK Count", LANG_SERVER, sName, ATAC_GetInfo(iTarget, AtacInfo_Kills), ATAC_GetSetting(AtacSetting_KillsLimit)); + IRC_PrivMsg(channel, "[ATAC] %T", "IRC Kick Count", LANG_SERVER, sName, ATAC_GetInfo(iTarget, AtacInfo_Kicks), ATAC_GetSetting(AtacSetting_KicksLimit)); + IRC_PrivMsg(channel, "[ATAC] %T", "IRC Ban Count", LANG_SERVER, sName, ATAC_GetInfo(iTarget, AtacInfo_Bans), ATAC_GetSetting(AtacSetting_BansLimit)); +} diff --git a/addons/sourcemod/scripting/atac-slap.sp b/addons/sourcemod/scripting/atac-slap.sp index 9575b06..f8976d7 100644 --- a/addons/sourcemod/scripting/atac-slap.sp +++ b/addons/sourcemod/scripting/atac-slap.sp @@ -1,59 +1,61 @@ -#pragma semicolon 1 - #include #include - #undef REQUIRE_PLUGIN #include -public Plugin:myinfo = +#pragma newdecls required +#pragma semicolon 1 + +public Plugin myinfo = { - name = "ATAC - Slap Punishment", - author = "GameConnect", - description = "Advanced Team Attack Control", - version = ATAC_VERSION, - url = "http://www.gameconnect.net" + name = "ATAC - Slap Punishment", + author = "GameConnect", + description = "Advanced Team Attack Control", + version = ATAC_VERSION, + url = "http://www.gameconnect.net" }; /** * Globals */ -new Handle:g_hDamage; +ConVar g_hDamage; /** * Plugin Forwards */ -public OnPluginStart() +public void OnPluginStart() { - // Create convars - g_hDamage = CreateConVar("atac_slap_damage", "50", "ATAC Slap Damage", FCVAR_PLUGIN); - - // Load translations - LoadTranslations("atac-slap.phrases"); - - if(LibraryExists("atac")) - OnLibraryAdded("atac"); + // Create convars + g_hDamage = CreateConVar("atac_slap_damage", "50", "ATAC Slap Damage"); + + // Load translations + LoadTranslations("atac-slap.phrases"); + + if (LibraryExists("atac")) { + OnLibraryAdded("atac"); + } } -public OnLibraryAdded(const String:name[]) +public void OnLibraryAdded(const char[] name) { - if(!StrEqual(name, "atac")) - return; - - decl String:sName[32]; - Format(sName, sizeof(sName), "%T", "Slap", LANG_SERVER); - ATAC_RegisterPunishment(sName, AtacPunishment_Slap); + if (!StrEqual(name, "atac")) { + return; + } + + char sName[32]; + Format(sName, sizeof(sName), "%T", "Slap", LANG_SERVER); + ATAC_RegisterPunishment(sName, AtacPunishment_Slap); } /** * ATAC Punishments */ -public AtacPunishment_Slap(victim, attacker) +public void AtacPunishment_Slap(int victim, int attacker) { - PrintToChatAll("%c[ATAC]%c %t", CLR_GREEN, CLR_DEFAULT, "Slapped", attacker, ATAC_GetInfo(attacker, AtacInfo_Kills), ATAC_GetSetting(AtacSetting_KillsLimit)); - - SlapPlayer(attacker, GetConVarInt(g_hDamage)); -} \ No newline at end of file + PrintToChatAll("%c[ATAC]%c %t", CLR_GREEN, CLR_DEFAULT, "Slapped", attacker, ATAC_GetInfo(attacker, AtacInfo_Kills), ATAC_GetSetting(AtacSetting_KillsLimit)); + + SlapPlayer(attacker, g_hDamage.IntValue); +} diff --git a/addons/sourcemod/scripting/atac-slay.sp b/addons/sourcemod/scripting/atac-slay.sp index ed94fcc..781adab 100644 --- a/addons/sourcemod/scripting/atac-slay.sp +++ b/addons/sourcemod/scripting/atac-slay.sp @@ -1,50 +1,52 @@ -#pragma semicolon 1 - #include #include - #undef REQUIRE_PLUGIN #include -public Plugin:myinfo = +#pragma newdecls required +#pragma semicolon 1 + +public Plugin myinfo = { - name = "ATAC - Slay Punishment", - author = "GameConnect", - description = "Advanced Team Attack Control", - version = ATAC_VERSION, - url = "http://www.gameconnect.net" + name = "ATAC - Slay Punishment", + author = "GameConnect", + description = "Advanced Team Attack Control", + version = ATAC_VERSION, + url = "http://www.gameconnect.net" }; /** * Plugin Forwards */ -public OnPluginStart() +public void OnPluginStart() { - // Load translations - LoadTranslations("atac-slay.phrases"); - - if(LibraryExists("atac")) - OnLibraryAdded("atac"); + // Load translations + LoadTranslations("atac-slay.phrases"); + + if (LibraryExists("atac")) { + OnLibraryAdded("atac"); + } } -public OnLibraryAdded(const String:name[]) +public void OnLibraryAdded(const char[] name) { - if(!StrEqual(name, "atac")) - return; - - decl String:sName[32]; - Format(sName, sizeof(sName), "%T", "Slay", LANG_SERVER); - ATAC_RegisterPunishment(sName, AtacPunishment_Slay); + if (!StrEqual(name, "atac")) { + return; + } + + char sName[32]; + Format(sName, sizeof(sName), "%T", "Slay", LANG_SERVER); + ATAC_RegisterPunishment(sName, AtacPunishment_Slay); } /** * ATAC Punishments */ -public AtacPunishment_Slay(victim, attacker) +public void AtacPunishment_Slay(int victim, int attacker) { - PrintToChatAll("%c[ATAC]%c %t", CLR_GREEN, CLR_DEFAULT, "Slayed", attacker, ATAC_GetInfo(attacker, AtacInfo_Kills), ATAC_GetSetting(AtacSetting_KillsLimit)); - - ForcePlayerSuicide(attacker); -} \ No newline at end of file + PrintToChatAll("%c[ATAC]%c %t", CLR_GREEN, CLR_DEFAULT, "Slayed", attacker, ATAC_GetInfo(attacker, AtacInfo_Kills), ATAC_GetSetting(AtacSetting_KillsLimit)); + + ForcePlayerSuicide(attacker); +} diff --git a/addons/sourcemod/scripting/atac-timebomb.sp b/addons/sourcemod/scripting/atac-timebomb.sp index 0e9870e..646243f 100644 --- a/addons/sourcemod/scripting/atac-timebomb.sp +++ b/addons/sourcemod/scripting/atac-timebomb.sp @@ -1,131 +1,130 @@ -#pragma semicolon 1 - #include #include - #undef REQUIRE_PLUGIN #include +#pragma newdecls required +#pragma semicolon 1 + #define SOUND_BEEP "buttons/button17.wav" #define SOUND_BOOM "weapons/explode3.wav" #define SOUND_FINAL "weapons/cguard/charging.wav" -public Plugin:myinfo = +public Plugin myinfo = { - name = "ATAC - TimeBomb Punishment", - author = "GameConnect", - description = "Advanced Team Attack Control", - version = ATAC_VERSION, - url = "http://www.gameconnect.net" + name = "ATAC - TimeBomb Punishment", + author = "GameConnect", + description = "Advanced Team Attack Control", + version = ATAC_VERSION, + url = "http://www.gameconnect.net" }; /** * Globals */ -new g_iBeamSprite; -new g_iExplosionSprite; -new g_iTimeBombTime[MAXPLAYERS + 1]; -new g_iGreyColor[4] = {128, 128, 128, 255}; -new g_iHaloSprite; -new g_iWhiteColor[4] = {255, 255, 255, 255}; -new Handle:g_hTicks; +int g_iBeamSprite; +int g_iExplosionSprite; +int g_iTimeBombTime[MAXPLAYERS + 1]; +int g_iGreyColor[4] = {128, 128, 128, 255}; +int g_iHaloSprite; +int g_iWhiteColor[4] = {255, 255, 255, 255}; +ConVar g_hTicks; /** * Plugin Forwards */ -public OnPluginStart() +public void OnPluginStart() { - // Create convars - g_hTicks = CreateConVar("atac_timebomb_ticks", "10", "ATAC TimeBomb Ticks", FCVAR_PLUGIN); - - // Load translations - LoadTranslations("atac-timebomb.phrases"); - - if(LibraryExists("atac")) - OnLibraryAdded("atac"); + // Create convars + g_hTicks = CreateConVar("atac_timebomb_ticks", "10", "ATAC TimeBomb Ticks"); + + // Load translations + LoadTranslations("atac-timebomb.phrases"); + + if (LibraryExists("atac")) { + OnLibraryAdded("atac"); + } } -public OnMapStart() +public void OnMapStart() { - g_iBeamSprite = PrecacheModel("materials/sprites/laser.vmt"); - g_iExplosionSprite = PrecacheModel("sprites/sprite_fire01.vmt"); - g_iHaloSprite = PrecacheModel("materials/sprites/halo01.vmt"); - - PrecacheSound(SOUND_BEEP, true); - PrecacheSound(SOUND_BOOM, true); - PrecacheSound(SOUND_FINAL, true); + g_iBeamSprite = PrecacheModel("materials/sprites/laser.vmt"); + g_iExplosionSprite = PrecacheModel("sprites/sprite_fire01.vmt"); + g_iHaloSprite = PrecacheModel("materials/sprites/halo01.vmt"); + + PrecacheSound(SOUND_BEEP, true); + PrecacheSound(SOUND_BOOM, true); + PrecacheSound(SOUND_FINAL, true); } -public OnLibraryAdded(const String:name[]) +public void OnLibraryAdded(const char[] name) { - if(!StrEqual(name, "atac")) - return; - - decl String:sName[32]; - Format(sName, sizeof(sName), "%T", "TimeBomb", LANG_SERVER); - ATAC_RegisterPunishment(sName, AtacPunishment_TimeBomb); + if (!StrEqual(name, "atac")) { + return; + } + + char sName[32]; + Format(sName, sizeof(sName), "%T", "TimeBomb", LANG_SERVER); + ATAC_RegisterPunishment(sName, AtacPunishment_TimeBomb); } /** * ATAC Punishments */ -public AtacPunishment_TimeBomb(victim, attacker) +public void AtacPunishment_TimeBomb(int victim, int attacker) { - PrintToChatAll("%c[ATAC]%c %t", CLR_GREEN, CLR_DEFAULT, "TimeBombed", attacker, ATAC_GetInfo(attacker, AtacInfo_Kills), ATAC_GetSetting(AtacSetting_KillsLimit)); - - g_iTimeBombTime[attacker] = GetConVarInt(g_hTicks); - CreateTimer(1.0, Timer_TimeBomb, attacker, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + PrintToChatAll("%c[ATAC]%c %t", CLR_GREEN, CLR_DEFAULT, "TimeBombed", attacker, ATAC_GetInfo(attacker, AtacInfo_Kills), ATAC_GetSetting(AtacSetting_KillsLimit)); + + g_iTimeBombTime[attacker] = g_hTicks.IntValue; + CreateTimer(1.0, Timer_TimeBomb, attacker, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); } /** * Timers */ -public Action:Timer_TimeBomb(Handle:timer, any:client) +public Action Timer_TimeBomb(Handle timer, any client) { - if(!IsClientInGame(client) || !IsPlayerAlive(client)) - return Plugin_Stop; - - decl Float:flPos[3]; - GetClientEyePosition(client, flPos); - - if(--g_iTimeBombTime[client]) - { - new iColor = 0; - if(g_iTimeBombTime[client] == 1) - EmitAmbientSound(SOUND_FINAL, flPos, client, SNDLEVEL_RAIDSIREN); - else - { - iColor = RoundToFloor(g_iTimeBombTime[client] * (255.0 / GetConVarInt(g_hTicks))); - EmitAmbientSound(SOUND_BEEP, flPos, client, SNDLEVEL_RAIDSIREN); - } - - SetEntityRenderColor(client, 255, iColor, iColor, 255); - PrintCenterTextAll("%t", "Till Explodes", g_iTimeBombTime[client], client); - - GetClientAbsOrigin(client, flPos); - flPos[2] += 10; - - TE_SetupBeamRingPoint(flPos, 10.0, 200.0, g_iBeamSprite, g_iHaloSprite, 0, 15, 0.5, 5.0, 0.0, g_iGreyColor, 10, 0); - TE_SendToAll(); - TE_SetupBeamRingPoint(flPos, 10.0, 200.0, g_iBeamSprite, g_iHaloSprite, 0, 10, 0.6, 10.0, 0.5, g_iWhiteColor, 10, 0); - TE_SendToAll(); - - return Plugin_Continue; - } - else - { - TE_SetupExplosion(flPos, g_iExplosionSprite, 0.1, 1, 0, 600, 5000); - TE_SendToAll(); - - EmitAmbientSound(SOUND_BOOM, flPos, client, SNDLEVEL_RAIDSIREN); - - ForcePlayerSuicide(client); - SetEntityRenderColor(client, 255, 255, 255, 255); - - return Plugin_Stop; - } -} \ No newline at end of file + if (!IsClientInGame(client) || !IsPlayerAlive(client)) { + return Plugin_Stop; + } + + float flPos[3]; + GetClientEyePosition(client, flPos); + + if (--g_iTimeBombTime[client]) { + int iColor = 0; + if (g_iTimeBombTime[client] == 1) { + EmitAmbientSound(SOUND_FINAL, flPos, client, SNDLEVEL_RAIDSIREN); + } else { + iColor = RoundToFloor(g_iTimeBombTime[client] * (255.0 / g_hTicks.IntValue)); + EmitAmbientSound(SOUND_BEEP, flPos, client, SNDLEVEL_RAIDSIREN); + } + + SetEntityRenderColor(client, 255, iColor, iColor, 255); + PrintCenterTextAll("%t", "Till Explodes", g_iTimeBombTime[client], client); + + GetClientAbsOrigin(client, flPos); + flPos[2] += 10; + + TE_SetupBeamRingPoint(flPos, 10.0, 200.0, g_iBeamSprite, g_iHaloSprite, 0, 15, 0.5, 5.0, 0.0, g_iGreyColor, 10, 0); + TE_SendToAll(); + TE_SetupBeamRingPoint(flPos, 10.0, 200.0, g_iBeamSprite, g_iHaloSprite, 0, 10, 0.6, 10.0, 0.5, g_iWhiteColor, 10, 0); + TE_SendToAll(); + + return Plugin_Continue; + } else { + TE_SetupExplosion(flPos, g_iExplosionSprite, 0.1, 1, 0, 600, 5000); + TE_SendToAll(); + + EmitAmbientSound(SOUND_BOOM, flPos, client, SNDLEVEL_RAIDSIREN); + + ForcePlayerSuicide(client); + SetEntityRenderColor(client, 255, 255, 255, 255); + + return Plugin_Stop; + } +} diff --git a/addons/sourcemod/scripting/atac-uberslap.sp b/addons/sourcemod/scripting/atac-uberslap.sp index 564470d..342be23 100644 --- a/addons/sourcemod/scripting/atac-uberslap.sp +++ b/addons/sourcemod/scripting/atac-uberslap.sp @@ -1,146 +1,146 @@ -#pragma semicolon 1 - #include #include - #undef REQUIRE_PLUGIN #include +#pragma newdecls required +#pragma semicolon 1 + #define SOUND_EXPLODE "ambient/explosions/explode_8.wav" -public Plugin:myinfo = +public Plugin myinfo = { - name = "ATAC - UberSlap Punishment", - author = "GameConnect", - description = "Advanced Team Attack Control", - version = ATAC_VERSION, - url = "http://www.gameconnect.net" + name = "ATAC - UberSlap Punishment", + author = "GameConnect", + description = "Advanced Team Attack Control", + version = ATAC_VERSION, + url = "http://www.gameconnect.net" }; /** * Globals */ -new g_iExplosionModel; -new g_iLightningModel; -new g_iSmokeModel; +int g_iExplosionModel; +int g_iLightningModel; +int g_iSmokeModel; /** * Plugin Forwards */ -public OnPluginStart() +public void OnPluginStart() { - // Load translations - LoadTranslations("atac-uberslap.phrases"); - - if(LibraryExists("atac")) - OnLibraryAdded("atac"); + // Load translations + LoadTranslations("atac-uberslap.phrases"); + + if (LibraryExists("atac")) { + OnLibraryAdded("atac"); + } } -public OnMapStart() +public void OnMapStart() { - g_iExplosionModel = PrecacheModel("materials/effects/fire_cloud1.vmt"); - g_iLightningModel = PrecacheModel("materials/sprites/tp_beam001.vmt"); - g_iSmokeModel = PrecacheModel("materials/effects/fire_cloud2.vmt"); - - PrecacheSound(SOUND_EXPLODE, true); + g_iExplosionModel = PrecacheModel("materials/effects/fire_cloud1.vmt"); + g_iLightningModel = PrecacheModel("materials/sprites/tp_beam001.vmt"); + g_iSmokeModel = PrecacheModel("materials/effects/fire_cloud2.vmt"); + + PrecacheSound(SOUND_EXPLODE, true); } -public OnLibraryAdded(const String:name[]) +public void OnLibraryAdded(const char[] name) { - if(!StrEqual(name, "atac")) - return; - - decl String:sName[32]; - Format(sName, sizeof(sName), "%T", "UberSlap", LANG_SERVER); - ATAC_RegisterPunishment(sName, AtacPunishment_UberSlap); + if (!StrEqual(name, "atac")) { + return; + } + + char sName[32]; + Format(sName, sizeof(sName), "%T", "UberSlap", LANG_SERVER); + ATAC_RegisterPunishment(sName, AtacPunishment_UberSlap); } /** * ATAC Punishments */ -public AtacPunishment_UberSlap(victim, attacker) +public void AtacPunishment_UberSlap(int victim, int attacker) { - PrintToChatAll("%c[ATAC]%c %t", CLR_GREEN, CLR_DEFAULT, "UberSlapped", attacker, ATAC_GetInfo(attacker, AtacInfo_Kills), ATAC_GetSetting(AtacSetting_KillsLimit)); - - CreateTimer(0.1, Timer_UberSlap, attacker, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); + PrintToChatAll("%c[ATAC]%c %t", CLR_GREEN, CLR_DEFAULT, "UberSlapped", attacker, ATAC_GetInfo(attacker, AtacInfo_Kills), ATAC_GetSetting(AtacSetting_KillsLimit)); + + CreateTimer(0.1, Timer_UberSlap, attacker, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT); } /** * Timers */ -public Action:Timer_UberSlap(Handle:timer, any:client) +public Action Timer_UberSlap(Handle timer, any client) { - if(!IsClientInGame(client)) - return Plugin_Stop; - - if(IsPlayerAlive(client) && GetClientHealth(client) > 1) - { - SlapEffects(client); - SlapPlayer(client, 1); - - return Plugin_Continue; - } - else - { - SlayEffects(client); - ForcePlayerSuicide(client); - - return Plugin_Stop; - } + if (!IsClientInGame(client)) { + return Plugin_Stop; + } + + if (IsPlayerAlive(client) && GetClientHealth(client) > 1) { + SlapEffects(client); + SlapPlayer(client, 1); + + return Plugin_Continue; + } else { + SlayEffects(client); + ForcePlayerSuicide(client); + + return Plugin_Stop; + } } /** * Stocks */ -stock SlapEffects(client) +void SlapEffects(int client) { - // Get player position to use as the ending coordinates - decl Float:flEnd[3], Float:flStart[3]; - GetClientAbsOrigin(client, flEnd); - - // Set the starting coordinates - flStart = flEnd; - flStart[2] += 1000; - - TE_SetupBeamPoints(flStart, flEnd, g_iLightningModel, g_iLightningModel, 0, 1, 0.1, 5.0, 5.0, 1, 1.0, {255, 255, 255, 255}, 250); - TE_SendToAll(); + // Get player position to use as the ending coordinates + float flEnd[3], flStart[3]; + GetClientAbsOrigin(client, flEnd); + + // Set the starting coordinates + flStart = flEnd; + flStart[2] += 1000; + + TE_SetupBeamPoints(flStart, flEnd, g_iLightningModel, g_iLightningModel, 0, 1, 0.1, 5.0, 5.0, 1, 1.0, {255, 255, 255, 255}, 250); + TE_SendToAll(); } -stock SlayEffects(client) +void SlayEffects(int client) { - decl Float:flEnd[3], Float:flSparkDir[3], Float:flSparkPos[3], Float:flStart[3]; - // Get player position to use as the ending coordinates - GetClientAbsOrigin(client, flEnd); - - // Set the starting coordinates - flSparkDir = flEnd; - flSparkPos = flEnd; - flStart = flEnd; - - flSparkDir[2] += 23; - flSparkPos[2] += 13; - flStart[2] += 1000; - - // create lightning effects and sparks, and explosion - TE_SetupBeamPoints(flStart, flEnd, g_iLightningModel, g_iLightningModel, 0, 1, 2.0, 5.0, 5.0, 1, 1.0, {255, 255, 255, 255}, 250); - TE_SendToAll(); - - TE_SetupExplosion(flEnd, g_iExplosionModel, 10.0, 10, TE_EXPLFLAG_NONE, 200, 255); - TE_SendToAll(); - - TE_SetupSmoke(flEnd, g_iExplosionModel, 50.0, 2); - TE_SendToAll(); - - TE_SetupSmoke(flEnd, g_iSmokeModel, 50.0, 2); - TE_SendToAll(); - - TE_SetupMetalSparks(flSparkPos, flSparkDir); - TE_SendToAll(); - - EmitAmbientSound(SOUND_EXPLODE, flEnd, SOUND_FROM_WORLD, SNDLEVEL_NORMAL, SND_NOFLAGS, 1.0, SNDPITCH_NORMAL, 0.0); -} \ No newline at end of file + float flEnd[3], flSparkDir[3], flSparkPos[3], flStart[3]; + // Get player position to use as the ending coordinates + GetClientAbsOrigin(client, flEnd); + + // Set the starting coordinates + flSparkDir = flEnd; + flSparkPos = flEnd; + flStart = flEnd; + + flSparkDir[2] += 23; + flSparkPos[2] += 13; + flStart[2] += 1000; + + // create lightning effects and sparks, and explosion + TE_SetupBeamPoints(flStart, flEnd, g_iLightningModel, g_iLightningModel, 0, 1, 2.0, 5.0, 5.0, 1, 1.0, {255, 255, 255, 255}, 250); + TE_SendToAll(); + + TE_SetupExplosion(flEnd, g_iExplosionModel, 10.0, 10, TE_EXPLFLAG_NONE, 200, 255); + TE_SendToAll(); + + TE_SetupSmoke(flEnd, g_iExplosionModel, 50.0, 2); + TE_SendToAll(); + + TE_SetupSmoke(flEnd, g_iSmokeModel, 50.0, 2); + TE_SendToAll(); + + TE_SetupMetalSparks(flSparkPos, flSparkDir); + TE_SendToAll(); + + EmitAmbientSound(SOUND_EXPLODE, flEnd, SOUND_FROM_WORLD, SNDLEVEL_NORMAL, SND_NOFLAGS, 1.0, SNDPITCH_NORMAL, 0.0); +} diff --git a/addons/sourcemod/scripting/atac.sp b/addons/sourcemod/scripting/atac.sp index cbcf529..887fe09 100644 --- a/addons/sourcemod/scripting/atac.sp +++ b/addons/sourcemod/scripting/atac.sp @@ -1,17 +1,18 @@ -#pragma semicolon 1 - #include #include #include #include -public Plugin:myinfo = +#pragma newdecls required +#pragma semicolon 1 + +public Plugin myinfo = { - name = "Advanced Team Attack Control", - author = "GameConnect", - description = "Advanced Team Attack Control: Source", - version = ATAC_VERSION, - url = "http://www.gameconnect.net" + name = "Advanced Team Attack Control", + author = "GameConnect", + description = "Advanced Team Attack Control: Source", + version = ATAC_VERSION, + url = "http://www.gameconnect.net" } @@ -20,674 +21,688 @@ public Plugin:myinfo = */ enum Mod { - Mod_Default, - Mod_Insurgency + Mod_Default, + Mod_Insurgency } -new g_iAttacker[MAXPLAYERS + 1] = {-1}; -new g_iAttacks[MAXPLAYERS + 1]; -new g_iAttacksLimit; -new g_iBansLimit; -new g_iBanTime; -new g_iBanType; -new g_iBans[MAXPLAYERS + 1]; -new g_iKarma[MAXPLAYERS + 1]; -new g_iKarmaLimit; -new g_iKicks[MAXPLAYERS + 1]; -new g_iKicksLimit; -new g_iKillKarma; -new g_iKills[MAXPLAYERS + 1]; -new g_iKillsLimit; -new g_iSpawnPunishDelay; -new bool:g_bEnabled; -new bool:g_bIgnoreBots; -new bool:g_bImmunity; -new Function:g_fPunishmentCallbacks[64]; -new Handle:g_hAttacksLimit; -new Handle:g_hBansLimit; -new Handle:g_hBanTime; -new Handle:g_hBanType; -new Handle:g_hEnabled; -new Handle:g_hIgnoreBots; -new Handle:g_hImmunity; -new Handle:g_hKarmaLimit; -new Handle:g_hKicksLimit; -new Handle:g_hKillKarma; -new Handle:g_hKillsLimit; -new Handle:g_hPunishmentPlugins[64]; -new Handle:g_hPunishments; -new Handle:g_hSpawnPunishDelay; -new Handle:g_hSpawnPunishment[MAXPLAYERS + 1]; -new Handle:g_hSQLiteDB; -new Mod:g_iMod = Mod_Default; +int g_iAttacker[MAXPLAYERS + 1] = {-1}; +int g_iAttacks[MAXPLAYERS + 1]; +int g_iAttacksLimit; +int g_iBansLimit; +int g_iBanTime; +int g_iBanType; +int g_iBans[MAXPLAYERS + 1]; +int g_iKarma[MAXPLAYERS + 1]; +int g_iKarmaLimit; +int g_iKicks[MAXPLAYERS + 1]; +int g_iKicksLimit; +int g_iKillKarma; +int g_iKills[MAXPLAYERS + 1]; +int g_iKillsLimit; +int g_iSpawnPunishDelay; +bool g_bEnabled; +bool g_bIgnoreBots; +bool g_bImmunity; +Function g_fPunishmentCallbacks[64]; +ConVar g_hAttacksLimit; +ConVar g_hBansLimit; +ConVar g_hBanTime; +ConVar g_hBanType; +ConVar g_hEnabled; +ConVar g_hIgnoreBots; +ConVar g_hImmunity; +ConVar g_hKarmaLimit; +ConVar g_hKicksLimit; +ConVar g_hKillKarma; +ConVar g_hKillsLimit; +Handle g_hPunishmentPlugins[64]; +ArrayList g_hPunishments; +ConVar g_hSpawnPunishDelay; +DataPack g_hSpawnPunishment[MAXPLAYERS + 1]; +Database g_hSQLiteDB; +Mod g_iMod = Mod_Default; /** * Plugin Forwards */ -public APLRes:AskPluginLoad2(Handle:myself, bool:late, String:error[], err_max) +public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) { - CreateNative("ATAC_GetInfo", Native_GetInfo); - CreateNative("ATAC_GetSetting", Native_GetSetting); - CreateNative("ATAC_GiveKarma", Native_GiveKarma); - CreateNative("ATAC_RegisterPunishment", Native_RegisterPunishment); - CreateNative("ATAC_SetInfo", Native_SetInfo); - RegPluginLibrary("atac"); - - return APLRes_Success; + CreateNative("ATAC_GetInfo", Native_GetInfo); + CreateNative("ATAC_GetSetting", Native_GetSetting); + CreateNative("ATAC_GiveKarma", Native_GiveKarma); + CreateNative("ATAC_RegisterPunishment", Native_RegisterPunishment); + CreateNative("ATAC_SetInfo", Native_SetInfo); + RegPluginLibrary("atac"); + + return APLRes_Success; } -public OnPluginStart() +public void OnPluginStart() { - // Create convars - CreateConVar("atac_version", ATAC_VERSION, "Advanced Team Attack Control", FCVAR_DONTRECORD|FCVAR_NOTIFY|FCVAR_PLUGIN); - g_hAttacksLimit = CreateConVar("atac_attacks_limit", "10", "ATAC Attacks Limit", FCVAR_PLUGIN); - g_hBansLimit = CreateConVar("atac_bans_limit", "3", "ATAC Bans Limit", FCVAR_PLUGIN); - g_hBanTime = CreateConVar("atac_ban_time", "60", "ATAC Ban Time", FCVAR_PLUGIN); - g_hBanType = CreateConVar("atac_ban_type", "0", "ATAC Ban Type", FCVAR_PLUGIN); - g_hEnabled = CreateConVar("atac_enabled", "1", "ATAC Enabled", FCVAR_PLUGIN); - g_hIgnoreBots = CreateConVar("atac_ignore_bots", "1", "ATAC Ignore Bots", FCVAR_PLUGIN); - g_hImmunity = CreateConVar("atac_immunity", "0", "ATAC Immunity", FCVAR_PLUGIN); - g_hKarmaLimit = CreateConVar("atac_karma_limit", "5", "ATAC Karma Limit", FCVAR_PLUGIN); - g_hKicksLimit = CreateConVar("atac_kicks_limit", "3", "ATAC Kicks Limit", FCVAR_PLUGIN); - g_hKillKarma = CreateConVar("atac_kill_karma", "1", "ATAC Kill Karma", FCVAR_PLUGIN); - g_hKillsLimit = CreateConVar("atac_kills_limit", "3", "ATAC Kills Limit", FCVAR_PLUGIN); - g_hSpawnPunishDelay = CreateConVar("atac_spawnpunish_delay", "6", "ATAC Spawn Punish Delay", FCVAR_PLUGIN); - - // Hook convar changes - HookConVarChange(g_hAttacksLimit, ConVarChanged_ConVars); - HookConVarChange(g_hBansLimit, ConVarChanged_ConVars); - HookConVarChange(g_hBanTime, ConVarChanged_ConVars); - HookConVarChange(g_hBanType, ConVarChanged_ConVars); - HookConVarChange(g_hEnabled, ConVarChanged_ConVars); - HookConVarChange(g_hIgnoreBots, ConVarChanged_ConVars); - HookConVarChange(g_hImmunity, ConVarChanged_ConVars); - HookConVarChange(g_hKarmaLimit, ConVarChanged_ConVars); - HookConVarChange(g_hKicksLimit, ConVarChanged_ConVars); - HookConVarChange(g_hKillKarma, ConVarChanged_ConVars); - HookConVarChange(g_hKillsLimit, ConVarChanged_ConVars); - HookConVarChange(g_hSpawnPunishDelay, ConVarChanged_ConVars); - - // Hook events - HookEvent("player_death", Event_PlayerDeath); - HookEvent("player_hurt", Event_PlayerHurt); - HookEvent("player_spawn", Event_PlayerSpawn); - - // Load translations - LoadTranslations("atac.phrases"); - LoadTranslations("common.phrases"); - LoadTranslations("core.phrases"); - - // Create commands - RegConsoleCmd("sm_karmahelp", Command_KarmaHelp, "ATAC Karma Help"); - RegConsoleCmd("sm_tkstatus", Command_TKStatus, "ATAC TK Status"); - - // Create arrays and tries - g_hPunishments = CreateArray(64); - - // Store mod - decl String:sBuffer[65]; - GetGameFolderName(sBuffer, sizeof(sBuffer)); - - if(StrContains(sBuffer, "insurgency", false) != -1) - g_iMod = Mod_Insurgency; - else - { - GetGameDescription(sBuffer, sizeof(sBuffer)); - - if(StrContains(sBuffer, "Insurgency", false) != -1) - g_iMod = Mod_Insurgency; - } - - AutoExecConfig(true, "atac"); + // Create convars + CreateConVar("atac_version", ATAC_VERSION, "Advanced Team Attack Control: Source"); + g_hAttacksLimit = CreateConVar("atac_attacks_limit", "10", "ATAC Attacks Limit"); + g_hBansLimit = CreateConVar("atac_bans_limit", "3", "ATAC Bans Limit"); + g_hBanTime = CreateConVar("atac_ban_time", "60", "ATAC Ban Time"); + g_hBanType = CreateConVar("atac_ban_type", "0", "ATAC Ban Type"); + g_hEnabled = CreateConVar("atac_enabled", "1", "ATAC Enabled"); + g_hIgnoreBots = CreateConVar("atac_ignore_bots", "1", "ATAC Ignore Bots"); + g_hImmunity = CreateConVar("atac_immunity", "0", "ATAC Immunity"); + g_hKarmaLimit = CreateConVar("atac_karma_limit", "5", "ATAC Karma Limit"); + g_hKicksLimit = CreateConVar("atac_kicks_limit", "3", "ATAC Kicks Limit"); + g_hKillKarma = CreateConVar("atac_kill_karma", "1", "ATAC Kill Karma"); + g_hKillsLimit = CreateConVar("atac_kills_limit", "3", "ATAC Kills Limit"); + g_hSpawnPunishDelay = CreateConVar("atac_spawnpunish_delay", "6", "ATAC Spawn Punish Delay"); + + // Hook convar changes + g_hAttacksLimit.AddChangeHook(ConVarChanged_ConVars); + g_hBansLimit.AddChangeHook(ConVarChanged_ConVars); + g_hBanTime.AddChangeHook(ConVarChanged_ConVars); + g_hBanType.AddChangeHook(ConVarChanged_ConVars); + g_hEnabled.AddChangeHook(ConVarChanged_ConVars); + g_hIgnoreBots.AddChangeHook(ConVarChanged_ConVars); + g_hImmunity.AddChangeHook(ConVarChanged_ConVars); + g_hKarmaLimit.AddChangeHook(ConVarChanged_ConVars); + g_hKicksLimit.AddChangeHook(ConVarChanged_ConVars); + g_hKillKarma.AddChangeHook(ConVarChanged_ConVars); + g_hKillsLimit.AddChangeHook(ConVarChanged_ConVars); + g_hSpawnPunishDelay.AddChangeHook(ConVarChanged_ConVars); + + // Hook events + HookEvent("player_death", Event_PlayerDeath); + HookEvent("player_hurt", Event_PlayerHurt); + HookEvent("player_spawn", Event_PlayerSpawn); + + // Load translations + LoadTranslations("atac.phrases"); + LoadTranslations("common.phrases"); + LoadTranslations("core.phrases"); + + // Create commands + RegConsoleCmd("sm_karmahelp", Command_KarmaHelp, "ATAC Karma Help"); + RegConsoleCmd("sm_tkstatus", Command_TKStatus, "ATAC TK Status"); + + // Create arrays and tries + g_hPunishments = new ArrayList(64); + + // Store mod + char sBuffer[65]; + GetGameFolderName(sBuffer, sizeof(sBuffer)); + + if (StrContains(sBuffer, "insurgency", false) != -1) { + g_iMod = Mod_Insurgency; + } else { + GetGameDescription(sBuffer, sizeof(sBuffer)); + + if (StrContains(sBuffer, "Insurgency", false) != -1) { + g_iMod = Mod_Insurgency; + } + } + + AutoExecConfig(true, "atac"); } -public OnMapStart() +public void OnMapStart() { - GetTeams(g_iMod == Mod_Insurgency); - - if(!g_hSQLiteDB) - { - // Connect to local database - decl String:sError[256] = ""; - g_hSQLiteDB = SQLite_UseDatabase("sourcemod-local", sError, sizeof(sError)); - if(sError[0]) - { - LogError("%T (%s)", "Could not connect to database", LANG_SERVER, sError); - return; - } - - // Create local table - SQL_FastQuery(g_hSQLiteDB, "CREATE TABLE IF NOT EXISTS atac (identity TEXT PRIMARY KEY ON CONFLICT REPLACE, attacks INTEGER, kills INTEGER, kicks INTEGER, bans INTEGER, karma INTEGER, time INTEGER)"); - } - - // Delete players that haven't played for two weeks - decl String:sQuery[256]; - Format(sQuery, sizeof(sQuery), "DELETE FROM atac \ - WHERE time + %i <= %i", - 60 * 60 * 24 * 7 * 2, GetTime()); - SQL_FastQuery(g_hSQLiteDB, sQuery); - - // Load client information on late load - for(new i = 1; i <= MaxClients; i++) - { - if(IsClientInGame(i)) - LoadClient(i); - } + GetTeams(g_iMod == Mod_Insurgency); + + if (!g_hSQLiteDB) { + // Connect to local database + char sError[256] = ""; + g_hSQLiteDB = SQLite_UseDatabase("sourcemod-local", sError, sizeof(sError)); + if (sError[0]) { + LogError("%T (%s)", "Could not connect to database", LANG_SERVER, sError); + return; + } + + // Create local table + SQL_FastQuery(g_hSQLiteDB, "CREATE TABLE IF NOT EXISTS atac (identity TEXT PRIMARY KEY ON CONFLICT REPLACE, attacks INTEGER, kills INTEGER, kicks INTEGER, bans INTEGER, karma INTEGER, time INTEGER)"); + } + + // Delete players that haven't played for two weeks + char sQuery[256]; + Format(sQuery, sizeof(sQuery), "DELETE FROM atac \ + WHERE time + %i <= %i", + 60 * 60 * 24 * 7 * 2, GetTime()); + SQL_FastQuery(g_hSQLiteDB, sQuery); + + // Load client information on late load + for (int i = 1; i <= MaxClients; i++) { + if (IsClientInGame(i)) { + LoadClient(i); + } + } } -public OnPluginEnd() +public void OnPluginEnd() { - // Save client information on unload - for(new i = 1; i <= MaxClients; i++) - { - if(IsClientInGame(i)) - SaveClient(i); - } + // Save client information on unload + for (int i = 1; i <= MaxClients; i++) { + if (IsClientInGame(i)) { + SaveClient(i); + } + } } -public OnConfigsExecuted() +public void OnConfigsExecuted() { - g_bEnabled = GetConVarBool(g_hEnabled); - g_bIgnoreBots = GetConVarBool(g_hIgnoreBots); - g_bImmunity = GetConVarBool(g_hImmunity); - g_iAttacksLimit = GetConVarInt(g_hAttacksLimit); - g_iBansLimit = GetConVarInt(g_hBansLimit); - g_iBanTime = GetConVarInt(g_hBanTime); - g_iBanType = GetConVarInt(g_hBanType); - g_iKarmaLimit = GetConVarInt(g_hKarmaLimit); - g_iKicksLimit = GetConVarInt(g_hKicksLimit); - g_iKillKarma = GetConVarInt(g_hKillKarma); - g_iKillsLimit = GetConVarInt(g_hKillsLimit); - g_iSpawnPunishDelay = GetConVarInt(g_hSpawnPunishDelay); + g_bEnabled = g_hEnabled.BoolValue; + g_bIgnoreBots = g_hIgnoreBots.BoolValue; + g_bImmunity = g_hImmunity.BoolValue; + g_iAttacksLimit = g_hAttacksLimit.IntValue; + g_iBansLimit = g_hBansLimit.IntValue; + g_iBanTime = g_hBanTime.IntValue; + g_iBanType = g_hBanType.IntValue; + g_iKarmaLimit = g_hKarmaLimit.IntValue; + g_iKicksLimit = g_hKicksLimit.IntValue; + g_iKillKarma = g_hKillKarma.IntValue; + g_iKillsLimit = g_hKillsLimit.IntValue; + g_iSpawnPunishDelay = g_hSpawnPunishDelay.IntValue; } -public OnClientAuthorized(client, const String:auth[]) +public void OnClientAuthorized(int client, const char[] auth) { - // Reset client variables - g_hSpawnPunishment[client] = INVALID_HANDLE; - g_iAttacks[client] = - g_iBans[client] = - g_iKarma[client] = - g_iKicks[client] = - g_iKills[client] = 0; - - LoadClient(client); + // Reset client variables + g_hSpawnPunishment[client] = null; + g_iAttacks[client] = + g_iBans[client] = + g_iKarma[client] = + g_iKicks[client] = + g_iKills[client] = 0; + + LoadClient(client); } -public OnClientDisconnect(client) +public void OnClientDisconnect(int client) { - SaveClient(client); + SaveClient(client); } -public ConVarChanged_ConVars(Handle:convar, const String:oldValue[], const String:newValue[]) +public void ConVarChanged_ConVars(ConVar convar, const char[] oldValue, const char[] newValue) { - if(convar == g_hEnabled) - g_bEnabled = bool:StringToInt(newValue); - else if(convar == g_hIgnoreBots) - g_bIgnoreBots = bool:StringToInt(newValue); - else if(convar == g_hImmunity) - g_bImmunity = bool:StringToInt(newValue); - else if(convar == g_hAttacksLimit) - g_iAttacksLimit = StringToInt(newValue); - else if(convar == g_hBansLimit) - g_iBansLimit = StringToInt(newValue); - else if(convar == g_hBanTime) - g_iBanTime = StringToInt(newValue); - else if(convar == g_hBanType) - g_iBanType = StringToInt(newValue); - else if(convar == g_hKarmaLimit) - g_iKarmaLimit = StringToInt(newValue); - else if(convar == g_hKicksLimit) - g_iKicksLimit = StringToInt(newValue); - else if(convar == g_hKillKarma) - g_iKillKarma = StringToInt(newValue); - else if(convar == g_hKillsLimit) - g_iKillsLimit = StringToInt(newValue); - else if(convar == g_hSpawnPunishDelay) - g_iSpawnPunishDelay = StringToInt(newValue); + if (convar == g_hEnabled) { + g_bEnabled = view_as(StringToInt(newValue)); + } + else if (convar == g_hIgnoreBots) { + g_bIgnoreBots = view_as(StringToInt(newValue)); + } + else if (convar == g_hImmunity) { + g_bImmunity = view_as(StringToInt(newValue)); + } + else if (convar == g_hAttacksLimit) { + g_iAttacksLimit = StringToInt(newValue); + } + else if (convar == g_hBansLimit) { + g_iBansLimit = StringToInt(newValue); + } + else if (convar == g_hBanTime) { + g_iBanTime = StringToInt(newValue); + } + else if (convar == g_hBanType) { + g_iBanType = StringToInt(newValue); + } + else if (convar == g_hKarmaLimit) { + g_iKarmaLimit = StringToInt(newValue); + } + else if (convar == g_hKicksLimit) { + g_iKicksLimit = StringToInt(newValue); + } + else if (convar == g_hKillKarma) { + g_iKillKarma = StringToInt(newValue); + } + else if (convar == g_hKillsLimit) { + g_iKillsLimit = StringToInt(newValue); + } + else if (convar == g_hSpawnPunishDelay) { + g_iSpawnPunishDelay = StringToInt(newValue); + } } /** * Commands */ -public Action:Command_KarmaHelp(client, args) +public Action Command_KarmaHelp(int client, int args) { - if(!g_bEnabled || !client) - return Plugin_Handled; - - decl String:sExit[32], String:sLine1[256], String:sLine2[256], String:sLine3[256], String:sTitle[256]; - Format(sTitle, sizeof(sTitle), "%T", "Karma Help Title", client); - Format(sLine1, sizeof(sLine1), "%T", "Karma Help 1", client); - Format(sLine2, sizeof(sLine2), "%T", "Karma Help 2", client, g_iKarmaLimit); - Format(sLine3, sizeof(sLine3), "%T", "Karma Help 3", client, g_iKarma[client]); - Format(sExit, sizeof(sExit), "0. %T", "Exit", client); - - new Handle:hPanel = CreatePanel(); - SetPanelTitle(hPanel, sTitle); - DrawPanelText(hPanel, " "); - DrawPanelText(hPanel, sLine1); - DrawPanelText(hPanel, " "); - DrawPanelText(hPanel, sLine2); - DrawPanelText(hPanel, " "); - DrawPanelText(hPanel, sLine3); - DrawPanelText(hPanel, " "); - DrawPanelText(hPanel, sExit); - SendPanelToClient(hPanel, client, MenuHandler_DoNothing, MENU_TIME_FOREVER); - - return Plugin_Handled; + if (!g_bEnabled || !client) { + return Plugin_Handled; + } + + char sExit[32], sLine1[256], sLine2[256], sLine3[256], sTitle[256]; + Format(sTitle, sizeof(sTitle), "%T", "Karma Help Title", client); + Format(sLine1, sizeof(sLine1), "%T", "Karma Help 1", client); + Format(sLine2, sizeof(sLine2), "%T", "Karma Help 2", client, g_iKarmaLimit); + Format(sLine3, sizeof(sLine3), "%T", "Karma Help 3", client, g_iKarma[client]); + Format(sExit, sizeof(sExit), "0. %T", "Exit", client); + + Panel hPanel = new Panel(); + hPanel.SetTitle(sTitle); + hPanel.DrawText(" "); + hPanel.DrawText(sLine1); + hPanel.DrawText(" "); + hPanel.DrawText(sLine2); + hPanel.DrawText(" "); + hPanel.DrawText(sLine3); + hPanel.DrawText(" "); + hPanel.DrawText(sExit); + hPanel.Send(client, MenuHandler_DoNothing, MENU_TIME_FOREVER); + + return Plugin_Handled; } -public Action:Command_TKStatus(client, args) +public Action Command_TKStatus(int client, int args) { - if(!g_bEnabled || !client) - return Plugin_Handled; - - decl iTarget, String:sTarget[MAX_NAME_LENGTH + 1]; - if(GetCmdArgString(sTarget, sizeof(sTarget))) - { - if((iTarget = FindTarget(client, sTarget)) == -1) - return Plugin_Handled; - } - else - iTarget = client; - - decl String:sAttacks[255], String:sBans[255], String:sExit[32], String:sKarma[255], String:sKicks[255], String:sKills[255], String:sName[MAX_NAME_LENGTH + 1], String:sTitle[255]; - GetClientName(client, sName, sizeof(sName)); - Format(sTitle, sizeof(sTitle), "%T", "TK Status Title", client, iTarget); - Format(sKarma, sizeof(sKarma), "%T", "Karma Count", client, g_iKarma[iTarget], g_iKarmaLimit); - Format(sAttacks, sizeof(sAttacks), "%T", "Attacks Count", client, g_iAttacks[iTarget], g_iAttacksLimit); - Format(sKills, sizeof(sKills), "%T", "Kills Count", client, g_iKills[iTarget], g_iKillsLimit); - Format(sKicks, sizeof(sKicks), "%T", "Kicks Count", client, g_iKicks[iTarget], g_iKicksLimit); - Format(sBans, sizeof(sBans), "%T", "Bans Count", client, g_iBans[iTarget], g_iBansLimit); - Format(sExit, sizeof(sExit), "0. %T", "Exit", client); - - new Handle:hPanel = CreatePanel(); - SetPanelTitle(hPanel, sTitle); - DrawPanelText(hPanel, " "); - DrawPanelText(hPanel, sKarma); - DrawPanelText(hPanel, sAttacks); - DrawPanelText(hPanel, sKills); - DrawPanelText(hPanel, sKicks); - DrawPanelText(hPanel, sBans); - DrawPanelText(hPanel, " "); - DrawPanelText(hPanel, sExit); - SendPanelToClient(hPanel, client, MenuHandler_DoNothing, MENU_TIME_FOREVER); - - return Plugin_Handled; + if (!g_bEnabled || !client) { + return Plugin_Handled; + } + + char sTarget[MAX_NAME_LENGTH + 1]; + int iTarget = client; + if (GetCmdArgString(sTarget, sizeof(sTarget)) && (iTarget = FindTarget(client, sTarget)) == -1) { + return Plugin_Handled; + } + + char sAttacks[255], sBans[255], sExit[32], sKarma[255], sKicks[255], sKills[255], sName[MAX_NAME_LENGTH + 1], sTitle[255]; + GetClientName(client, sName, sizeof(sName)); + Format(sTitle, sizeof(sTitle), "%T", "TK Status Title", client, iTarget); + Format(sKarma, sizeof(sKarma), "%T", "Karma Count", client, g_iKarma[iTarget], g_iKarmaLimit); + Format(sAttacks, sizeof(sAttacks), "%T", "Attacks Count", client, g_iAttacks[iTarget], g_iAttacksLimit); + Format(sKills, sizeof(sKills), "%T", "Kills Count", client, g_iKills[iTarget], g_iKillsLimit); + Format(sKicks, sizeof(sKicks), "%T", "Kicks Count", client, g_iKicks[iTarget], g_iKicksLimit); + Format(sBans, sizeof(sBans), "%T", "Bans Count", client, g_iBans[iTarget], g_iBansLimit); + Format(sExit, sizeof(sExit), "0. %T", "Exit", client); + + Panel hPanel = new Panel(); + hPanel.SetTitle(sTitle); + hPanel.DrawText(" "); + hPanel.DrawText(sKarma); + hPanel.DrawText(sAttacks); + hPanel.DrawText(sKills); + hPanel.DrawText(sKicks); + hPanel.DrawText(sBans); + hPanel.DrawText(" "); + hPanel.DrawText(sExit); + hPanel.Send(client, MenuHandler_DoNothing, MENU_TIME_FOREVER); + + return Plugin_Handled; } /** * Events */ -public Event_PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast) +public void Event_PlayerDeath(Handle event, const char[] name, bool dontBroadcast) { - new iAttacker = GetClientOfUserId(GetEventInt(event, "attacker")), - iVictim = GetClientOfUserId(GetEventInt(event, "userid")); - - // If ATAC is disabled, there is no team kill limit, attacker is the world or it was self-damage, ignore - if(!g_bEnabled || !g_iKillsLimit || !iAttacker || iAttacker == iVictim) - return; - // If ignoring bots is enabled, and attacker or victim is a bot, ignore - if(g_bIgnoreBots && (IsFakeClient(iAttacker) || IsFakeClient(iVictim))) - return; - - // If it was not a team attack - if(GetClientTeam(iAttacker) != GetClientTeam(iVictim)) - { - // Handle karma for kills - decl String:sReason[256]; - Format(sReason, sizeof(sReason), "%T", "Killing Enemy", iAttacker); - ATAC_GiveKarma(iAttacker, g_iKillKarma, sReason); - return; - } - - PrintToChat(iVictim, "%c[ATAC]%c %t", CLR_GREEN, CLR_DEFAULT, "You Were Killed", iAttacker); - - // If immunity is enabled, and attacker has custom6 or root flag, ignore - if(g_bImmunity && GetUserFlagBits(iAttacker) & (ADMFLAG_CUSTOM6|ADMFLAG_ROOT)) - return; - - decl String:sForgive[32], String:sPunish[32]; - Format(sForgive, sizeof(sForgive), "%T", "Forgive", iVictim); - Format(sPunish, sizeof(sPunish), "%T", "Do Not Forgive", iVictim); - g_iAttacker[iVictim] = GetClientUserId(iAttacker); - - // Create punishment menu - new Handle:hMenu = CreateMenu(MenuHandler_Punishment); - SetMenuExitButton(hMenu, false); - SetMenuTitle(hMenu, "[ATAC] %T", "You Were Killed", iVictim, iAttacker); - AddMenuItem(hMenu, "Forgive", sForgive); - AddMenuItem(hMenu, "Punish", sPunish); - - // If immunity is disabled, or victim can target attacker, add punishments - if(!g_bImmunity || CanAdminTarget(GetUserAdmin(iVictim), GetUserAdmin(iAttacker))) - { - decl String:sPunishment[32]; - for(new i = 0, iSize = GetArraySize(g_hPunishments); i < iSize; i++) - { - // If callback is invalid, remove punishment - if(g_fPunishmentCallbacks[i] == INVALID_FUNCTION) - { - RemoveFromArray(g_hPunishments, i); - continue; - } - - GetArrayString(g_hPunishments, i, sPunishment, sizeof(sPunishment)); - AddMenuItem(hMenu, sPunishment, sPunishment); - } - } - - DisplayMenu(hMenu, iVictim, MENU_TIME_FOREVER); + int iAttacker = GetClientOfUserId(GetEventInt(event, "attacker")), + iVictim = GetClientOfUserId(GetEventInt(event, "userid")); + + // If ATAC is disabled, there is no team kill limit, attacker is the world or it was self-damage, ignore + if (!g_bEnabled || !g_iKillsLimit || !iAttacker || iAttacker == iVictim) { + return; + } + // If ignoring bots is enabled, and attacker or victim is a bot, ignore + if (g_bIgnoreBots && (IsFakeClient(iAttacker) || IsFakeClient(iVictim))) { + return; + } + + // If it was not a team attack + if (GetClientTeam(iAttacker) != GetClientTeam(iVictim)) { + // Handle karma for kills + char sReason[256]; + Format(sReason, sizeof(sReason), "%T", "Killing Enemy", iAttacker); + ATAC_GiveKarma(iAttacker, g_iKillKarma, sReason); + return; + } + + PrintToChat(iVictim, "%c[ATAC]%c %t", CLR_GREEN, CLR_DEFAULT, "You Were Killed", iAttacker); + + // If immunity is enabled, and attacker has custom6 or root flag, ignore + if (g_bImmunity && GetUserFlagBits(iAttacker) & (ADMFLAG_CUSTOM6|ADMFLAG_ROOT)) { + return; + } + + char sForgive[32], sPunish[32]; + Format(sForgive, sizeof(sForgive), "%T", "Forgive", iVictim); + Format(sPunish, sizeof(sPunish), "%T", "Do Not Forgive", iVictim); + g_iAttacker[iVictim] = GetClientUserId(iAttacker); + + // Create punishment menu + Menu hMenu = new Menu(MenuHandler_Punishment); + hMenu.ExitButton = false; + hMenu.SetTitle("[ATAC] %T", "You Were Killed", iVictim, iAttacker); + hMenu.AddItem("Forgive", sForgive); + hMenu.AddItem("Punish", sPunish); + + // If immunity is disabled, or victim can target attacker, add punishments + if (!g_bImmunity || CanAdminTarget(GetUserAdmin(iVictim), GetUserAdmin(iAttacker))) { + char sPunishment[32]; + for (int i = 0, iSize = g_hPunishments.Length; i < iSize; i++) { + // If callback is invalid, remove punishment + if (g_fPunishmentCallbacks[i] == INVALID_FUNCTION) { + g_hPunishments.Erase(i); + continue; + } + + g_hPunishments.GetString(i, sPunishment, sizeof(sPunishment)); + hMenu.AddItem(sPunishment, sPunishment); + } + } + + hMenu.Display(iVictim, MENU_TIME_FOREVER); } -public Event_PlayerHurt(Handle:event, const String:name[], bool:dontBroadcast) +public void Event_PlayerHurt(Handle event, const char[] name, bool dontBroadcast) { - new iAttacker = GetClientOfUserId(GetEventInt(event, "attacker")), - iVictim = GetClientOfUserId(GetEventInt(event, "userid")); - - // If ATAC is disabled, there is no team attack limit, attacker is the world, it was self-damage or it was not a team attack, ignore - if(!g_bEnabled || !g_iAttacksLimit || !iAttacker || iAttacker == iVictim || GetClientTeam(iAttacker) != GetClientTeam(iVictim)) - return; - // If ignoring bots is enabled, and attacker or victim is a bot, ignore - if(g_bIgnoreBots && (IsFakeClient(iAttacker) || IsFakeClient(iVictim))) - return; - // If immunity is enabled and attacker is immune, ignore - if(g_bImmunity && GetUserFlagBits(iAttacker) & (ADMFLAG_CUSTOM6|ADMFLAG_ROOT)) - return; - - g_iAttacks[iAttacker]++; - PrintToChatAll("%c[ATAC]%c %t", CLR_GREEN, CLR_DEFAULT, "Attacks", iAttacker, g_iAttacks[iAttacker], g_iAttacksLimit); - - if(g_iAttacks[iAttacker] < g_iAttacksLimit) - return; - - g_iAttacks[iAttacker] = 0; - g_iKills[iAttacker]++; - PrintToChatAll("%c[ATAC]%c %t", CLR_GREEN, CLR_DEFAULT, "Kills", iAttacker, g_iKills[iAttacker], g_iKillsLimit); - - if(g_iKills[iAttacker] < g_iKillsLimit) - return; - - if(g_iKicksLimit) - { - g_iKills[iAttacker] = 0; - if(++g_iKicks[iAttacker] >= g_iKicksLimit && g_iBansLimit) - { - decl String:sReason[256]; - Format(sReason, sizeof(sReason), "[ATAC] %t", "Ban Reason", iAttacker); - - g_iKicks[iAttacker] = 0; - if(++g_iBans[iAttacker] >= g_iBansLimit) - { - g_iBans[iAttacker] = 0; - //BanClient(iAttacker, 0, g_iBanType == IP_BAN_TYPE ? BANFLAG_IP : BANFLAG_AUTHID, sReason, sReason, "atac"); - ServerCommand("sm_ban #%d %d \"%s\"", GetClientUserId(iAttacker), 0, sReason); - } - else - //BanClient(iAttacker, g_iBanTime, g_iBanType == IP_BAN_TYPE ? BANFLAG_IP : BANFLAG_AUTHID, sReason, sReason, "atac"); - ServerCommand("sm_ban #%d %d \"%s\"", GetClientUserId(iAttacker), g_iBanTime, sReason); - } - else - KickClient(iAttacker, "[ATAC] %t", "You Were Kicked"); - } + int iAttacker = GetClientOfUserId(GetEventInt(event, "attacker")), + iVictim = GetClientOfUserId(GetEventInt(event, "userid")); + + // If ATAC is disabled, there is no team attack limit, attacker is the world, it was self-damage or it was not a team attack, ignore + if (!g_bEnabled || !g_iAttacksLimit || !iAttacker || iAttacker == iVictim || GetClientTeam(iAttacker) != GetClientTeam(iVictim)) { + return; + } + // If ignoring bots is enabled, and attacker or victim is a bot, ignore + if (g_bIgnoreBots && (IsFakeClient(iAttacker) || IsFakeClient(iVictim))) { + return; + } + // If immunity is enabled and attacker is immune, ignore + if (g_bImmunity && GetUserFlagBits(iAttacker) & (ADMFLAG_CUSTOM6|ADMFLAG_ROOT)) { + return; + } + + g_iAttacks[iAttacker]++; + PrintToChatAll("%c[ATAC]%c %t", CLR_GREEN, CLR_DEFAULT, "Attacks", iAttacker, g_iAttacks[iAttacker], g_iAttacksLimit); + + if (g_iAttacks[iAttacker] < g_iAttacksLimit) { + return; + } + + g_iAttacks[iAttacker] = 0; + g_iKills[iAttacker]++; + PrintToChatAll("%c[ATAC]%c %t", CLR_GREEN, CLR_DEFAULT, "Kills", iAttacker, g_iKills[iAttacker], g_iKillsLimit); + + if (g_iKills[iAttacker] < g_iKillsLimit) { + return; + } + + if (g_iKicksLimit) { + g_iKills[iAttacker] = 0; + if (++g_iKicks[iAttacker] >= g_iKicksLimit && g_iBansLimit) { + char sReason[256]; + Format(sReason, sizeof(sReason), "[ATAC] %t", "Ban Reason", iAttacker); + + g_iKicks[iAttacker] = 0; + if (++g_iBans[iAttacker] >= g_iBansLimit) { + g_iBans[iAttacker] = 0; + BanClient(iAttacker, 0, g_iBanType == IP_BAN_TYPE ? BANFLAG_IP : BANFLAG_AUTHID, sReason, sReason, "atac"); + } else { + BanClient(iAttacker, g_iBanTime, g_iBanType == IP_BAN_TYPE ? BANFLAG_IP : BANFLAG_AUTHID, sReason, sReason, "atac"); + } + } else { + KickClient(iAttacker, "[ATAC] %t", "You Were Kicked"); + } + } } -public Event_PlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast) +public void Event_PlayerSpawn(Handle event, const char[] name, bool dontBroadcast) { - new iClient = GetClientOfUserId(GetEventInt(event, "userid")); - if(g_hSpawnPunishment[iClient]) - CreateTimer(g_iSpawnPunishDelay * 1.0, Timer_SpawnPunishment, iClient); + int iClient = GetClientOfUserId(GetEventInt(event, "userid")); + if (g_hSpawnPunishment[iClient]) { + CreateTimer(g_iSpawnPunishDelay * 1.0, Timer_SpawnPunishment, iClient); + } } /** * Menu Handlers */ -public MenuHandler_DoNothing(Handle:menu, MenuAction:action, param1, param2) {} +public int MenuHandler_DoNothing(Menu menu, MenuAction action, int param1, int param2) {} -public MenuHandler_Punishment(Handle:menu, MenuAction:action, param1, param2) +public int MenuHandler_Punishment(Menu menu, MenuAction action, int param1, int param2) { - // If there was no item selected, ignore - if(action != MenuAction_Select) - return; - - decl String:sPunishment[32]; - GetMenuItem(menu, param2, sPunishment, sizeof(sPunishment)); - - new iAttacker = GetClientOfUserId(g_iAttacker[param1]), - iPunishment = FindStringInArray(g_hPunishments, sPunishment); - g_iAttacker[param1] = -1; - - // If attacker or punishment is invalid, ignore - if(!iAttacker || iPunishment == -1) - return; - - // If forgiven - if(StrEqual(sPunishment, "Forgive")) - { - LogPlayerEvent(iAttacker, "triggered", "Forgiven_For_TeamKill"); - LogAction(param1, iAttacker, "\"%L\" forgave \"%L\" for team killing", param1, iAttacker); - - PrintToChatAll("%c[ATAC]%c %t", CLR_GREEN, CLR_DEFAULT, "Forgiven", param1, iAttacker); - } - // If not forgiven - else if(StrEqual(sPunishment, "Punish")) - { - LogPlayerEvent(iAttacker, "triggered", "Punished_For_TeamKill"); - LogAction(param1, iAttacker, "\"%L\" punished \"%L\" for team killing", param1, iAttacker); - - PrintToChatAll("%c[ATAC]%c %t", CLR_GREEN, CLR_DEFAULT, "Not Forgiven", iAttacker, g_iKills[iAttacker], g_iKillsLimit); - } - // If punished - else - { - decl String:sProperties[64]; - Format(sProperties, sizeof(sProperties), " (punishment \"%s\")", sPunishment); - - LogPlayerEvent(iAttacker, "triggered", "Punished_For_TeamKill", false, sProperties); - LogAction(param1, iAttacker, "\"%L\" punished \"%L\" for team killing%s", param1, iAttacker, sProperties); - - // If attacker is alive, punish now - if(IsPlayerAlive(iAttacker)) - PunishPlayer(iPunishment, param1, iAttacker); - // Otherwise, punish on next spawn - else - { - g_hSpawnPunishment[iAttacker] = CreateDataPack(); - WritePackCell(g_hSpawnPunishment[iAttacker], param1); - WritePackString(g_hSpawnPunishment[iAttacker], sPunishment); - } - } + // If there was no item selected, ignore + if (action != MenuAction_Select) { + return; + } + + char sPunishment[32]; + GetMenuItem(menu, param2, sPunishment, sizeof(sPunishment)); + + int iAttacker = GetClientOfUserId(g_iAttacker[param1]), + iPunishment = g_hPunishments.FindString(sPunishment); + g_iAttacker[param1] = -1; + + // If attacker or punishment is invalid, ignore + if (!iAttacker || iPunishment == -1) { + return; + } + + // If forgiven + if (StrEqual(sPunishment, "Forgive")) { + LogPlayerEvent(iAttacker, "triggered", "Forgiven_For_TeamKill"); + LogAction(param1, iAttacker, "\"%L\" forgave \"%L\" for team killing", param1, iAttacker); + + PrintToChatAll("%c[ATAC]%c %t", CLR_GREEN, CLR_DEFAULT, "Forgiven", param1, iAttacker); + } + // If not forgiven + else if (StrEqual(sPunishment, "Punish")) { + LogPlayerEvent(iAttacker, "triggered", "Punished_For_TeamKill"); + LogAction(param1, iAttacker, "\"%L\" punished \"%L\" for team killing", param1, iAttacker); + + PrintToChatAll("%c[ATAC]%c %t", CLR_GREEN, CLR_DEFAULT, "Not Forgiven", iAttacker, g_iKills[iAttacker], g_iKillsLimit); + } + // If punished + else { + char sProperties[64]; + Format(sProperties, sizeof(sProperties), " (punishment \"%s\")", sPunishment); + + LogPlayerEvent(iAttacker, "triggered", "Punished_For_TeamKill", false, sProperties); + LogAction(param1, iAttacker, "\"%L\" punished \"%L\" for team killing%s", param1, iAttacker, sProperties); + + // If attacker is alive, punish now + if (IsPlayerAlive(iAttacker)) { + PunishPlayer(iPunishment, param1, iAttacker); + } + // Otherwise, punish on next spawn + else { + g_hSpawnPunishment[iAttacker] = new DataPack(); + g_hSpawnPunishment[iAttacker].WriteCell(param1); + g_hSpawnPunishment[iAttacker].WriteString(sPunishment); + } + } } /** * Timers */ -public Action:Timer_SpawnPunishment(Handle:timer, any:client) +public Action Timer_SpawnPunishment(Handle timer, any client) { - ResetPack(g_hSpawnPunishment[client]); - decl String:sPunishment[32]; - new iVictim = ReadPackCell(g_hSpawnPunishment[client]); - ReadPackString(g_hSpawnPunishment[client], sPunishment, sizeof(sPunishment)); - - CloseHandle(g_hSpawnPunishment[client]); - g_hSpawnPunishment[client] = INVALID_HANDLE; - - new iPunishment = FindStringInArray(g_hPunishments, sPunishment); - if(iPunishment != -1) - PunishPlayer(iPunishment, iVictim, client); + g_hSpawnPunishment[client].Reset(); + char sPunishment[32]; + int iVictim = g_hSpawnPunishment[client].ReadCell(); + g_hSpawnPunishment[client].ReadString(sPunishment, sizeof(sPunishment)); + + delete g_hSpawnPunishment[client]; + + int iPunishment = g_hPunishments.FindString(sPunishment); + if (iPunishment != -1) { + PunishPlayer(iPunishment, iVictim, client); + } } /** * Natives */ -public Native_GetInfo(Handle:plugin, numParams) +public int Native_GetInfo(Handle plugin, int numParams) { - new iClient = GetNativeCell(1); - - switch(GetNativeCell(2)) - { - case AtacInfo_Attacks: - return g_iAttacks[iClient]; - case AtacInfo_Bans: - return g_iBans[iClient]; - case AtacInfo_Karma: - return g_iKarma[iClient]; - case AtacInfo_Kicks: - return g_iKicks[iClient]; - case AtacInfo_Kills: - return g_iKills[iClient]; - } - - return -1; + int iClient = GetNativeCell(1); + + switch (GetNativeCell(2)) { + case AtacInfo_Attacks: + return g_iAttacks[iClient]; + case AtacInfo_Bans: + return g_iBans[iClient]; + case AtacInfo_Karma: + return g_iKarma[iClient]; + case AtacInfo_Kicks: + return g_iKicks[iClient]; + case AtacInfo_Kills: + return g_iKills[iClient]; + } + + return -1; } -public Native_GetSetting(Handle:plugin, numParams) +public int Native_GetSetting(Handle plugin, int numParams) { - switch(GetNativeCell(1)) - { - case AtacSetting_AttacksLimit: - return g_iAttacksLimit; - case AtacSetting_BansLimit: - return g_iBansLimit; - case AtacSetting_BanTime: - return g_iBanTime; - case AtacSetting_BanType: - return g_iBanType; - case AtacSetting_Enabled: - return g_bEnabled; - case AtacSetting_IgnoreBots: - return g_bIgnoreBots; - case AtacSetting_Immunity: - return g_bImmunity; - case AtacSetting_KarmaLimit: - return g_iKarmaLimit; - case AtacSetting_KicksLimit: - return g_iKicksLimit; - case AtacSetting_KillKarma: - return g_iKillKarma; - case AtacSetting_KillsLimit: - return g_iKillsLimit; - } - - return -1; + switch (GetNativeCell(1)) { + case AtacSetting_AttacksLimit: + return g_iAttacksLimit; + case AtacSetting_BansLimit: + return g_iBansLimit; + case AtacSetting_BanTime: + return g_iBanTime; + case AtacSetting_BanType: + return g_iBanType; + case AtacSetting_Enabled: + return g_bEnabled; + case AtacSetting_IgnoreBots: + return g_bIgnoreBots; + case AtacSetting_Immunity: + return g_bImmunity; + case AtacSetting_KarmaLimit: + return g_iKarmaLimit; + case AtacSetting_KicksLimit: + return g_iKicksLimit; + case AtacSetting_KillKarma: + return g_iKillKarma; + case AtacSetting_KillsLimit: + return g_iKillsLimit; + } + + return -1; } -public Native_GiveKarma(Handle:plugin, numParams) +public int Native_GiveKarma(Handle plugin, int numParams) { - new iClient = GetNativeCell(1), - iKarma = GetNativeCell(2); - - if(!g_iKarmaLimit || !iKarma || !g_iKills[iClient]) - return; - - g_iKarma[iClient] += iKarma; - if(g_iKarma[iClient] > g_iKarmaLimit) - g_iKarma[iClient] = g_iKarmaLimit; - - decl String:sReason[32]; - GetNativeString(3, sReason, sizeof(sReason)); - - if(sReason[0]) - PrintToChat(iClient, "%c[ATAC]%c %t %s", CLR_GREEN, CLR_DEFAULT, "Earned Karma", g_iKarma[iClient], g_iKarmaLimit, sReason); - if(g_iKarma[iClient] < g_iKarmaLimit) - return; - - g_iKarma[iClient] = 0; - g_iKills[iClient]--; - PrintToChat(iClient, "%c[ATAC]%c %t", CLR_GREEN, CLR_DEFAULT, "Now Have Kills", g_iKills[iClient], g_iKillsLimit); + int iClient = GetNativeCell(1), + iKarma = GetNativeCell(2); + + if (!g_iKarmaLimit || !iKarma || !g_iKills[iClient]) { + return; + } + + g_iKarma[iClient] += iKarma; + if (g_iKarma[iClient] > g_iKarmaLimit) { + g_iKarma[iClient] = g_iKarmaLimit; + } + + char sReason[32]; + GetNativeString(3, sReason, sizeof(sReason)); + + if (sReason[0]) { + PrintToChat(iClient, "%c[ATAC]%c %t %s", CLR_GREEN, CLR_DEFAULT, "Earned Karma", g_iKarma[iClient], g_iKarmaLimit, sReason); + } + if (g_iKarma[iClient] < g_iKarmaLimit) { + return; + } + + g_iKarma[iClient] = 0; + g_iKills[iClient]--; + PrintToChat(iClient, "%c[ATAC]%c %t", CLR_GREEN, CLR_DEFAULT, "Now Have Kills", g_iKills[iClient], g_iKillsLimit); } -public Native_RegisterPunishment(Handle:plugin, numParams) +public int Native_RegisterPunishment(Handle plugin, int numParams) { - decl String:sName[32]; - GetNativeString(1, sName, sizeof(sName)); - - new iPunishment = FindStringInArray(g_hPunishments, sName); - if(iPunishment == -1) - iPunishment = PushArrayString(g_hPunishments, sName); - - g_fPunishmentCallbacks[iPunishment] = Function:GetNativeCell(2); - g_hPunishmentPlugins[iPunishment] = plugin; + char sName[32]; + GetNativeString(1, sName, sizeof(sName)); + + int iPunishment = g_hPunishments.FindString(sName); + if (iPunishment == -1) { + iPunishment = g_hPunishments.PushString(sName); + } + + g_fPunishmentCallbacks[iPunishment] = GetNativeFunction(2); + g_hPunishmentPlugins[iPunishment] = plugin; } -public Native_SetInfo(Handle:plugin, numParams) +public int Native_SetInfo(Handle plugin, int numParams) { - new iClient = GetNativeCell(1), - iValue = GetNativeCell(3); - - switch(GetNativeCell(2)) - { - case AtacInfo_Attacks: - g_iAttacks[iClient] = iValue; - case AtacInfo_Bans: - g_iBans[iClient] = iValue; - case AtacInfo_Karma: - g_iKarma[iClient] = iValue; - case AtacInfo_Kicks: - g_iKicks[iClient] = iValue; - case AtacInfo_Kills: - g_iKills[iClient] = iValue; - } - - SaveClient(iClient); + int iClient = GetNativeCell(1), + iValue = GetNativeCell(3); + + switch (GetNativeCell(2)) { + case AtacInfo_Attacks: + g_iAttacks[iClient] = iValue; + case AtacInfo_Bans: + g_iBans[iClient] = iValue; + case AtacInfo_Karma: + g_iKarma[iClient] = iValue; + case AtacInfo_Kicks: + g_iKicks[iClient] = iValue; + case AtacInfo_Kills: + g_iKills[iClient] = iValue; + } + + SaveClient(iClient); } /** * Stocks */ -LoadClient(client) +void LoadClient(int client) { - if(!g_hSQLiteDB) - return; - - // Query local table - decl String:sAuth[20], String:sIp[15], String:sQuery[256]; - GetClientAuthString(client, sAuth, sizeof(sAuth)); - GetClientIP(client, sIp, sizeof(sIp)); - Format(sQuery, sizeof(sQuery), "SELECT attacks, kills, kicks, bans, karma \ - FROM atac \ - WHERE identity = '%s' \ - OR identity = '%s'", - sAuth, sIp); - - new Handle:hQuery = SQL_Query(g_hSQLiteDB, sQuery); - if(!hQuery || !SQL_FetchRow(hQuery)) - return; - - // Store counts - g_iAttacks[client] = SQL_FetchInt(hQuery, 0); - g_iBans[client] = SQL_FetchInt(hQuery, 3); - g_iKarma[client] = SQL_FetchInt(hQuery, 4); - g_iKicks[client] = SQL_FetchInt(hQuery, 2); - g_iKills[client] = SQL_FetchInt(hQuery, 1); + if (!g_hSQLiteDB) { + return; + } + + // Query local table + char sAuth[20], sIp[15], sQuery[256]; + GetClientAuthId(client, AuthId_Steam2, sAuth, sizeof(sAuth)); + GetClientIP(client, sIp, sizeof(sIp)); + Format(sQuery, sizeof(sQuery), "SELECT attacks, kills, kicks, bans, karma \ + FROM atac \ + WHERE identity = '%s' \ + OR identity = '%s'", + sAuth, sIp); + + DBResultSet hResults = SQL_Query(g_hSQLiteDB, sQuery); + if (!hResults || !hResults.FetchRow()) { + return; + } + + // Store counts + g_iAttacks[client] = hResults.FetchInt(0); + g_iBans[client] = hResults.FetchInt(3); + g_iKarma[client] = hResults.FetchInt(4); + g_iKicks[client] = hResults.FetchInt(2); + g_iKills[client] = hResults.FetchInt(1); } -PunishPlayer(punishment, victim, attacker) +void PunishPlayer(int punishment, int victim, int attacker) { - Call_StartFunction(g_hPunishmentPlugins[punishment], g_fPunishmentCallbacks[punishment]); - Call_PushCell(victim); - Call_PushCell(attacker); - Call_Finish(); + Call_StartFunction(g_hPunishmentPlugins[punishment], g_fPunishmentCallbacks[punishment]); + Call_PushCell(victim); + Call_PushCell(attacker); + Call_Finish(); } -SaveClient(client) +void SaveClient(int client) { - if(!g_hSQLiteDB) - return; - - decl String:sIdentity[20], String:sQuery[256]; - if(!GetClientAuthString(client, sIdentity, sizeof(sIdentity))) - GetClientIP(client, sIdentity, sizeof(sIdentity)); - - Format(sQuery, sizeof(sQuery), "INSERT INTO atac (identity, attacks, kills, kicks, bans, karma, time) \ - VALUES ('%s', %i, %i, %i, %i, %i, %i)", - sIdentity, g_iAttacks[client], g_iKills[client], g_iKicks[client], g_iBans[client], g_iKarma[client], GetTime()); - SQL_FastQuery(g_hSQLiteDB, sQuery); -} \ No newline at end of file + if (!g_hSQLiteDB) { + return; + } + + char sIdentity[20], sQuery[256]; + if (!GetClientAuthId(client, AuthId_Steam2, sIdentity, sizeof(sIdentity))) { + GetClientIP(client, sIdentity, sizeof(sIdentity)); + } + + Format(sQuery, sizeof(sQuery), "INSERT INTO atac (identity, attacks, kills, kicks, bans, karma, time) \ + VALUES ('%s', %i, %i, %i, %i, %i, %i)", + sIdentity, g_iAttacks[client], g_iKills[client], g_iKicks[client], g_iBans[client], g_iKarma[client], GetTime()); + SQL_FastQuery(g_hSQLiteDB, sQuery); +} diff --git a/addons/sourcemod/scripting/include/atac.inc b/addons/sourcemod/scripting/include/atac.inc index 78dc28b..db28b10 100644 --- a/addons/sourcemod/scripting/include/atac.inc +++ b/addons/sourcemod/scripting/include/atac.inc @@ -11,33 +11,33 @@ #define STEAM_BAN_TYPE 0 #define IP_BAN_TYPE 1 -#define ATAC_VERSION "2.5.0" +#define ATAC_VERSION "2.5.1" enum AtacInfo { - AtacInfo_Attacks, - AtacInfo_Bans, - AtacInfo_Karma, - AtacInfo_Kicks, - AtacInfo_Kills + AtacInfo_Attacks, + AtacInfo_Bans, + AtacInfo_Karma, + AtacInfo_Kicks, + AtacInfo_Kills } enum AtacSetting { - AtacSetting_AttacksLimit, - AtacSetting_BansLimit, - AtacSetting_BanTime, - AtacSetting_BanType, - AtacSetting_Enabled, - AtacSetting_IgnoreBots, - AtacSetting_Immunity, - AtacSetting_KarmaLimit, - AtacSetting_KicksLimit, - AtacSetting_KillKarma, - AtacSetting_KillsLimit + AtacSetting_AttacksLimit, + AtacSetting_BansLimit, + AtacSetting_BanTime, + AtacSetting_BanType, + AtacSetting_Enabled, + AtacSetting_IgnoreBots, + AtacSetting_Immunity, + AtacSetting_KarmaLimit, + AtacSetting_KicksLimit, + AtacSetting_KillKarma, + AtacSetting_KillsLimit } -functag public AtacPunishment(victim, attacker); +typedef AtacPunishment = function void (int victim, int attacker); /** @@ -47,7 +47,7 @@ functag public AtacPunishment(victim, attacker); * @param type AtacInfo type * @return Value of client's information type */ -native ATAC_GetInfo(client, AtacInfo:type); +native any ATAC_GetInfo(client, AtacInfo type); /** * Retrieves a setting's value @@ -55,7 +55,7 @@ native ATAC_GetInfo(client, AtacInfo:type); * @param type AtacSetting type * @return Value of setting */ -native ATAC_GetSetting(AtacSetting:type); +native any ATAC_GetSetting(AtacSetting type); /** * Gives a client karma @@ -63,18 +63,16 @@ native ATAC_GetSetting(AtacSetting:type); * @param client Player index * @param karma Amount of karma to give * @param reason Reason for earning karma - * @noreturn */ -native ATAC_GiveKarma(client, karma, const String:reason[] = ""); +native void ATAC_GiveKarma(int client, int karma, const char[] reason = ""); /** * Registers an ATAC punishment * * @param name Name of the punishment * @param callback Command callback - * @noreturn */ -native ATAC_RegisterPunishment(const String:name[], AtacPunishment:callback); +native void ATAC_RegisterPunishment(const char[] name, AtacPunishment callback); /** * Stores client information @@ -82,27 +80,26 @@ native ATAC_RegisterPunishment(const String:name[], AtacPunishment:callback); * @param client Player index * @param type AtacInfo type * @param value The value to store - * @noreturn */ -native ATAC_SetInfo(client, AtacInfo:type, value); +native void ATAC_SetInfo(int client, AtacInfo type, any value); -public SharedPlugin:__pl_atac = +public SharedPlugin __pl_atac = { - name = "atac", - file = "atac.smx", - #if defined REQUIRE_PLUGIN - required = 1, - #else - required = 0, - #endif + name = "atac", + file = "atac.smx", + #if defined REQUIRE_PLUGIN + required = 1, + #else + required = 0, + #endif }; public __pl_atac_SetNTVOptional() { - MarkNativeAsOptional("ATAC_GetInfo"); - MarkNativeAsOptional("ATAC_GetSetting"); - MarkNativeAsOptional("ATAC_GiveKarma"); - MarkNativeAsOptional("ATAC_RegisterPunishment"); - MarkNativeAsOptional("ATAC_SetInfo"); -} \ No newline at end of file + MarkNativeAsOptional("ATAC_GetInfo"); + MarkNativeAsOptional("ATAC_GetSetting"); + MarkNativeAsOptional("ATAC_GiveKarma"); + MarkNativeAsOptional("ATAC_RegisterPunishment"); + MarkNativeAsOptional("ATAC_SetInfo"); +} diff --git a/addons/sourcemod/scripting/include/loghelper.inc b/addons/sourcemod/scripting/include/loghelper.inc new file mode 100644 index 0000000..f2d032f --- /dev/null +++ b/addons/sourcemod/scripting/include/loghelper.inc @@ -0,0 +1,245 @@ +#define LOGHELPER_VERSION 5 + +#include +#include + +char g_team_list[16][64]; + +// Call this on map start to cache team names in g_team_list + +stock void GetTeams(bool insmod = false) +{ + if (!insmod) + { + int max_teams_count = GetTeamCount(); + for (int team_index = 0; (team_index < max_teams_count); team_index++) + { + char team_name[64]; + GetTeamName(team_index, team_name, sizeof(team_name)); + + if (strcmp(team_name, "") != 0) + { + g_team_list[team_index] = team_name; + } + } + } + else + { + // they really need to get their act together... GetTeamName() would be awesome since they can't even keep their team indexes consistent + char mapname[64]; + GetCurrentMap(mapname, sizeof(mapname)); + if (strcmp(mapname, "ins_karam") == 0 || strcmp(mapname, "ins_baghdad") == 0) + { + g_team_list[1] = "Iraqi Insurgents"; + g_team_list[2] = "U.S. Marines"; + } + else + { + g_team_list[1] = "U.S. Marines"; + g_team_list[2] = "Iraqi Insurgents"; + } + g_team_list[0] = "Unassigned"; + g_team_list[3] = "SPECTATOR"; + } +} + +stock void LogPlayerEvent(int client, const char[] verb, const char[] event, bool display_location = false, const char[] properties = "") +{ + if (IsValidPlayer(client)) + { + char player_authid[32]; + if (!GetClientAuthId(client, AuthId_Engine, player_authid, sizeof(player_authid), false)) + { + strcopy(player_authid, sizeof(player_authid), "UNKNOWN"); + } + + if (display_location) + { + float player_origin[3]; + GetClientAbsOrigin(client, player_origin); + LogToGame("\"%N<%d><%s><%s>\" %s \"%s\"%s (position \"%d %d %d\")", client, GetClientUserId(client), player_authid, g_team_list[GetClientTeam(client)], verb, event, properties, RoundFloat(player_origin[0]), RoundFloat(player_origin[1]), RoundFloat(player_origin[2])); + } + else + { + LogToGame("\"%N<%d><%s><%s>\" %s \"%s\"%s", client, GetClientUserId(client), player_authid, g_team_list[GetClientTeam(client)], verb, event, properties); + } + } +} + +stock void LogPlyrPlyrEvent(int client, int victim, const char[] verb, const char[] event, bool display_location = false, const char[] properties = "") +{ + if (IsValidPlayer(client) && IsValidPlayer(victim)) + { + char player_authid[32]; + if (!GetClientAuthId(client, AuthId_Engine, player_authid, sizeof(player_authid), false)) + { + strcopy(player_authid, sizeof(player_authid), "UNKNOWN"); + } + char victim_authid[32]; + if (!GetClientAuthId(victim, AuthId_Engine, victim_authid, sizeof(victim_authid), false)) + { + strcopy(victim_authid, sizeof(victim_authid), "UNKNOWN"); + } + + if (display_location) + { + float player_origin[3]; + GetClientAbsOrigin(client, player_origin); + + float victim_origin[3]; + GetClientAbsOrigin(victim, victim_origin); + + LogToGame("\"%N<%d><%s><%s>\" %s \"%s\" against \"%N<%d><%s><%s>\"%s (position \"%d %d %d\") (victim_position \"%d %d %d\")", client, GetClientUserId(client), player_authid, g_team_list[GetClientTeam(client)], verb, event, victim, GetClientUserId(victim), victim_authid, g_team_list[GetClientTeam(victim)], properties, RoundFloat(player_origin[0]), RoundFloat(player_origin[1]), RoundFloat(player_origin[2]), RoundFloat(victim_origin[0]), RoundFloat(victim_origin[1]), RoundFloat(victim_origin[2])); + } + else + { + LogToGame("\"%N<%d><%s><%s>\" %s \"%s\" against \"%N<%d><%s><%s>\"%s", client, GetClientUserId(client), player_authid, g_team_list[GetClientTeam(client)], verb, event, victim, GetClientUserId(victim), victim_authid, g_team_list[GetClientTeam(victim)], properties); + } + } +} + +stock void LogKill(int attacker, int victim, const char[] weapon, bool display_location = false, const char[] properties = "") +{ + if (IsValidPlayer(attacker) && IsValidPlayer(victim)) + { + char attacker_authid[32]; + if (!GetClientAuthId(attacker, AuthId_Engine, attacker_authid, sizeof(attacker_authid), false)) + { + strcopy(attacker_authid, sizeof(attacker_authid), "UNKNOWN"); + } + char victim_authid[32]; + if (!GetClientAuthId(victim, AuthId_Engine, victim_authid, sizeof(victim_authid), false)) + { + strcopy(victim_authid, sizeof(victim_authid), "UNKNOWN"); + } + + if (display_location) + { + float attacker_origin[3]; + GetClientAbsOrigin(attacker, attacker_origin); + float victim_origin[3]; + GetClientAbsOrigin(victim, victim_origin); + + LogToGame("\"%N<%d><%s><%s>\" killed \"%N<%d><%s><%s>\" with \"%s\"%s (attacker_position \"%d %d %d\") (victim_position \"%d %d %d\")", attacker, GetClientUserId(attacker), attacker_authid, g_team_list[GetClientTeam(attacker)], victim, GetClientUserId(victim), victim_authid, g_team_list[GetClientTeam(victim)], weapon, properties, RoundFloat(attacker_origin[0]), RoundFloat(attacker_origin[1]), RoundFloat(attacker_origin[2]), RoundFloat(victim_origin[0]), RoundFloat(victim_origin[1]), RoundFloat(victim_origin[2])); + } + else + { + LogToGame("\"%N<%d><%s><%s>\" killed \"%N<%d><%s><%s>\" with \"%s\"%s", attacker, GetClientUserId(attacker), attacker_authid, g_team_list[GetClientTeam(attacker)], victim, GetClientUserId(victim), victim_authid, g_team_list[GetClientTeam(victim)], weapon, properties); + } + } +} + +stock void LogSuicide(int victim, const char[] weapon, bool display_location = false, const char[] properties = "") +{ + if (IsValidPlayer(victim)) + { + char victim_authid[32]; + if (!GetClientAuthId(victim, AuthId_Engine, victim_authid, sizeof(victim_authid), false)) + { + strcopy(victim_authid, sizeof(victim_authid), "UNKNOWN"); + } + + if (display_location) + { + float victim_origin[3]; + GetClientAbsOrigin(victim, victim_origin); + + LogToGame("\"%N<%d><%s><%s>\" committed suicide with \"%s\"%s (victim_position \"%d %d %d\")", victim, GetClientUserId(victim), victim_authid, g_team_list[GetClientTeam(victim)], weapon, properties, RoundFloat(victim_origin[0]), RoundFloat(victim_origin[1]), RoundFloat(victim_origin[2])); + } + else + { + LogToGame("\"%N<%d><%s><%s>\" committed suicide with \"%s\"%s", victim, GetClientUserId(victim), victim_authid, g_team_list[GetClientTeam(victim)], weapon, properties); + } + } +} + +// For Psychostats "KTRAJ" kill trajectory log lines +stock void LogPSKillTraj(int attacker, int victim, const char[] weapon) +{ + if (IsValidPlayer(attacker) && IsValidPlayer(victim)) + { + char attacker_authid[32]; + if (!GetClientAuthId(attacker, AuthId_Engine, attacker_authid, sizeof(attacker_authid), false)) + { + strcopy(attacker_authid, sizeof(attacker_authid), "UNKNOWN"); + } + char victim_authid[32]; + if (!GetClientAuthId(victim, AuthId_Engine, victim_authid, sizeof(victim_authid), false)) + { + strcopy(victim_authid, sizeof(victim_authid), "UNKNOWN"); + } + + float attacker_origin[3]; + GetClientAbsOrigin(attacker, attacker_origin); + float victim_origin[3]; + GetClientAbsOrigin(victim, victim_origin); + + LogToGame("[KTRAJ] \"%N<%d><%s><%s>\" killed \"%N<%d><%s><%s>\" with \"%s\" (attacker_position \"%d %d %d\") (victim_position \"%d %d %d\")", attacker, GetClientUserId(attacker), attacker_authid, g_team_list[GetClientTeam(attacker)], victim, GetClientUserId(victim), victim_authid, g_team_list[GetClientTeam(victim)], weapon, RoundFloat(attacker_origin[0]), RoundFloat(attacker_origin[1]), RoundFloat(attacker_origin[2]), RoundFloat(victim_origin[0]), RoundFloat(victim_origin[1]), RoundFloat(victim_origin[2])); + } +} + +// Verb should always be "triggered" for this. +stock void LogTeamEvent(int team, const char[] verb, const char[] event, const char[] properties = "") +{ + if (team > -1) + { + LogToGame("Team \"%s\" %s \"%s\"%s", g_team_list[team], verb, event, properties); + } +} + +stock void LogKillLoc(int attacker, int victim) +{ + if (attacker > 0 && victim > 0) + { + float attacker_origin[3]; + GetClientAbsOrigin(attacker, attacker_origin); + float victim_origin[3]; + GetClientAbsOrigin(victim, victim_origin); + + LogToGame("World triggered \"killlocation\" (attacker_position \"%d %d %d\") (victim_position \"%d %d %d\")", RoundFloat(attacker_origin[0]), RoundFloat(attacker_origin[1]), RoundFloat(attacker_origin[2]), RoundFloat(victim_origin[0]), RoundFloat(victim_origin[1]), RoundFloat(victim_origin[2])); + } +} + +stock void LogTeamChange(int client, int newteam, const char[] properties = "") +{ + if (IsValidPlayer(client)) + { + char player_authid[32]; + if (!GetClientAuthId(client, AuthId_Engine, player_authid, sizeof(player_authid), false)) + { + strcopy(player_authid, sizeof(player_authid), "UNKNOWN"); + } + + LogToGame("\"%N<%d><%s><%s>\" joined team \"%s\"%s", client, GetClientUserId(client), player_authid, g_team_list[GetClientTeam(client)], g_team_list[newteam], properties); + } +} + +stock void LogRoleChange(int client, const char[] role, const char[] properties = "") +{ + if (IsValidPlayer(client)) + { + char player_authid[32]; + if (!GetClientAuthId(client, AuthId_Engine, player_authid, sizeof(player_authid), false)) + { + strcopy(player_authid, sizeof(player_authid), "UNKNOWN"); + } + + LogToGame("\"%N<%d><%s><%s>\" changed role to \"%s\"%s", client, GetClientUserId(client), player_authid, g_team_list[GetClientTeam(client)], role, properties); + } +} + +stock void LogMapLoad() +{ + char map[64]; + GetCurrentMap(map, sizeof(map)); + LogToGame("Loading map \"%s\"", map); +} + +static stock bool IsValidPlayer(int client) +{ + if (client > 0 && client <= MaxClients && IsClientInGame(client)) + { + return true; + } + return false; +} \ No newline at end of file diff --git a/addons/sourcemod/translations/atac-beacon.phrases.txt b/addons/sourcemod/translations/atac-beacon.phrases.txt index 23f668b..f50d986 100644 --- a/addons/sourcemod/translations/atac-beacon.phrases.txt +++ b/addons/sourcemod/translations/atac-beacon.phrases.txt @@ -1,12 +1,12 @@ "Phrases" { - "Beacon" - { - "en" "Beacon" - } - "Beaconed" - { - "#format" "{1:N},{2:i},{3:i}" - "en" "{1} has been beaconed for team killing and now has {2}/{3} team kills." - } -} \ No newline at end of file + "Beacon" + { + "en" "Beacon" + } + "Beaconed" + { + "#format" "{1:N},{2:i},{3:i}" + "en" "{1} has been beaconed for team killing and now has {2}/{3} team kills." + } +} diff --git a/addons/sourcemod/translations/atac-blind.phrases.txt b/addons/sourcemod/translations/atac-blind.phrases.txt index e9c84c9..3e40fa8 100644 --- a/addons/sourcemod/translations/atac-blind.phrases.txt +++ b/addons/sourcemod/translations/atac-blind.phrases.txt @@ -1,12 +1,12 @@ "Phrases" { - "Blind" - { - "en" "Blind" - } - "Blinded" - { - "#format" "{1:N},{2:i},{3:i}" - "en" "{1} has been blinded for team killing and now has {2}/{3} team kills." - } -} \ No newline at end of file + "Blind" + { + "en" "Blind" + } + "Blinded" + { + "#format" "{1:N},{2:i},{3:i}" + "en" "{1} has been blinded for team killing and now has {2}/{3} team kills." + } +} diff --git a/addons/sourcemod/translations/atac-css.phrases.txt b/addons/sourcemod/translations/atac-css.phrases.txt index dd9a89d..a850da9 100644 --- a/addons/sourcemod/translations/atac-css.phrases.txt +++ b/addons/sourcemod/translations/atac-css.phrases.txt @@ -1,30 +1,30 @@ "Phrases" { - "Defusing Bomb" - { - "en" "defusing the bomb." - } - "Detonating Bomb" - { - "en" "detonating the bomb." - } - "Planting Bomb" - { - "en" "planting the bomb." - } - "Rescuing Hostage" - { - "en" "rescuing a hostage." - } - "Spawn Attacking" - { - "#format" "{1:N},{2:N}" - "en" "{1} has been slayed for spawn attacking {2}." - "de" "{1} wurde erschlagen wegen Spawnattacke an {2}." - "fr" "{1} a t tu(e) massacre au spawn sur {2}." - } - "Winning Round" - { - "en" "winning the round." - } -} \ No newline at end of file + "Defusing Bomb" + { + "en" "defusing the bomb." + } + "Detonating Bomb" + { + "en" "detonating the bomb." + } + "Planting Bomb" + { + "en" "planting the bomb." + } + "Rescuing Hostage" + { + "en" "rescuing a hostage." + } + "Spawn Attacking" + { + "#format" "{1:N},{2:N}" + "en" "{1} has been slayed for spawn attacking {2}." + "de" "{1} wurde erschlagen wegen Spawnattacke an {2}." + "fr" "{1} a t tu(e) massacre au spawn sur {2}." + } + "Winning Round" + { + "en" "winning the round." + } +} diff --git a/addons/sourcemod/translations/atac-dods.phrases.txt b/addons/sourcemod/translations/atac-dods.phrases.txt index d421762..2dfe016 100644 --- a/addons/sourcemod/translations/atac-dods.phrases.txt +++ b/addons/sourcemod/translations/atac-dods.phrases.txt @@ -1,42 +1,42 @@ "Phrases" { - "Blocking Capture" - { - "en" "blocking a capture." - } - "Capturing Point" - { - "en" "capturing a point." - } - "Defusing Bomb" - { - "en" "defusing a bomb." - } - "Detonating Bomb" - { - "en" "detonating a bomb." - } - "Killing Defuser" - { - "en" "killing a bomb defuser." - } - "Killing Planter" - { - "en" "killing a bomb planter." - } - "Planting Bomb" - { - "en" "planting a bomb." - } - "Spawn Attacking" - { - "#format" "{1:N},{2:N}" - "en" "{1} has been slayed for spawn attacking {2}." - "de" "{1} wurde erschlagen wegen Spawnattacke an {2}." - "fr" "{1} a t tu(e) massacre au spawn sur {2}." - } - "Winning Round" - { - "en" "winning the round." - } -} \ No newline at end of file + "Blocking Capture" + { + "en" "blocking a capture." + } + "Capturing Point" + { + "en" "capturing a point." + } + "Defusing Bomb" + { + "en" "defusing a bomb." + } + "Detonating Bomb" + { + "en" "detonating a bomb." + } + "Killing Defuser" + { + "en" "killing a bomb defuser." + } + "Killing Planter" + { + "en" "killing a bomb planter." + } + "Planting Bomb" + { + "en" "planting a bomb." + } + "Spawn Attacking" + { + "#format" "{1:N},{2:N}" + "en" "{1} has been slayed for spawn attacking {2}." + "de" "{1} wurde erschlagen wegen Spawnattacke an {2}." + "fr" "{1} a t tu(e) massacre au spawn sur {2}." + } + "Winning Round" + { + "en" "winning the round." + } +} diff --git a/addons/sourcemod/translations/atac-drug.phrases.txt b/addons/sourcemod/translations/atac-drug.phrases.txt index 3167bc6..5fcec25 100644 --- a/addons/sourcemod/translations/atac-drug.phrases.txt +++ b/addons/sourcemod/translations/atac-drug.phrases.txt @@ -1,12 +1,12 @@ "Phrases" { - "Drug" - { - "en" "Drug" - } - "Drugged" - { - "#format" "{1:N},{2:i},{3:i}" - "en" "{1} has been drugged for team killing and now has {2}/{3} team kills." - } -} \ No newline at end of file + "Drug" + { + "en" "Drug" + } + "Drugged" + { + "#format" "{1:N},{2:i},{3:i}" + "en" "{1} has been drugged for team killing and now has {2}/{3} team kills." + } +} diff --git a/addons/sourcemod/translations/atac-fire.phrases.txt b/addons/sourcemod/translations/atac-fire.phrases.txt index 30ffe58..6775da0 100644 --- a/addons/sourcemod/translations/atac-fire.phrases.txt +++ b/addons/sourcemod/translations/atac-fire.phrases.txt @@ -1,26 +1,26 @@ "Phrases" { - "Burn" - { - "en" "Burn" - } - "Burned" - { - "#format" "{1:N},{2:i},{3:i}" - "en" "{1} has been burned for team killing and now has {2}/{3} team kills." - } - "FireBomb" - { - "en" "Firebomb" - } - "FireBombed" - { - "#format" "{1:N},{2:i},{3:i}" - "en" "{1} has been turned into a firebomb for team killing and now has {2}/{3} team kills." - } - "Till Explodes" - { - "#format" "{1:d},{2:N}" - "en" "{1} seconds until {2} explodes." - } -} \ No newline at end of file + "Burn" + { + "en" "Burn" + } + "Burned" + { + "#format" "{1:N},{2:i},{3:i}" + "en" "{1} has been burned for team killing and now has {2}/{3} team kills." + } + "FireBomb" + { + "en" "Firebomb" + } + "FireBombed" + { + "#format" "{1:N},{2:i},{3:i}" + "en" "{1} has been turned into a firebomb for team killing and now has {2}/{3} team kills." + } + "Till Explodes" + { + "#format" "{1:d},{2:N}" + "en" "{1} seconds until {2} explodes." + } +} diff --git a/addons/sourcemod/translations/atac-freeze.phrases.txt b/addons/sourcemod/translations/atac-freeze.phrases.txt index 91448d9..175ef8a 100644 --- a/addons/sourcemod/translations/atac-freeze.phrases.txt +++ b/addons/sourcemod/translations/atac-freeze.phrases.txt @@ -1,26 +1,26 @@ "Phrases" { - "Freeze" - { - "en" "Freeze" - } - "FreezeBomb" - { - "en" "Freezebomb" - } - "FreezeBombed" - { - "#format" "{1:N},{2:i},{3:i}" - "en" "{1} has been turned into a freezebomb for team killing and now has {2}/{3} team kills." - } - "Frozen" - { - "#format" "{1:N},{2:i},{3:i}" - "en" "{1} has been frozen for team killing and now has {2}/{3} team kills." - } - "Till Explodes" - { - "#format" "{1:d},{2:N}" - "en" "{1} seconds until {2} explodes." - } -} \ No newline at end of file + "Freeze" + { + "en" "Freeze" + } + "FreezeBomb" + { + "en" "Freezebomb" + } + "FreezeBombed" + { + "#format" "{1:N},{2:i},{3:i}" + "en" "{1} has been turned into a freezebomb for team killing and now has {2}/{3} team kills." + } + "Frozen" + { + "#format" "{1:N},{2:i},{3:i}" + "en" "{1} has been frozen for team killing and now has {2}/{3} team kills." + } + "Till Explodes" + { + "#format" "{1:d},{2:N}" + "en" "{1} seconds until {2} explodes." + } +} diff --git a/addons/sourcemod/translations/atac-ins.phrases.txt b/addons/sourcemod/translations/atac-ins.phrases.txt index 1f8f59f..ca1a8db 100644 --- a/addons/sourcemod/translations/atac-ins.phrases.txt +++ b/addons/sourcemod/translations/atac-ins.phrases.txt @@ -1,18 +1,18 @@ "Phrases" { - "Capturing Point" - { - "en" "capturing a point." - } - "Spawn Attacking" - { - "#format" "{1:N},{2:N}" - "en" "{1} has been slayed for spawn attacking {2}." - "de" "{1} wurde erschlagen wegen Spawnattacke an {2}." - "fr" "{1} a t tu(e) massacre au spawn sur {2}." - } - "Winning Round" - { - "en" "winning the round." - } -} \ No newline at end of file + "Capturing Point" + { + "en" "capturing a point." + } + "Spawn Attacking" + { + "#format" "{1:N},{2:N}" + "en" "{1} has been slayed for spawn attacking {2}." + "de" "{1} wurde erschlagen wegen Spawnattacke an {2}." + "fr" "{1} a t tu(e) massacre au spawn sur {2}." + } + "Winning Round" + { + "en" "winning the round." + } +} diff --git a/addons/sourcemod/translations/atac-ircrelay.phrases.txt b/addons/sourcemod/translations/atac-ircrelay.phrases.txt index 4c0aeb5..b459f94 100644 --- a/addons/sourcemod/translations/atac-ircrelay.phrases.txt +++ b/addons/sourcemod/translations/atac-ircrelay.phrases.txt @@ -1,84 +1,84 @@ "Phrases" { - "IRC Ban Count" - { - "#format" "{1:s},{2:i},{3:i}" - "en" "{1} has {2}/{3} bans." - "nl" "{1} heeft {2}/{3} bans." - } - "IRC Karma Count" - { - "#format" "{1:s},{2:i},{3:i}" - "en" "{1} has {2}/{3} karma." - "nl" "{1} heeft {2}/{3} karma." - } - "IRC Kick Count" - { - "#format" "{1:s},{2:i},{3:i}" - "en" "{1} has {2}/{3} kicks." - "nl" "{1} heeft {2}/{3} kicks." - } - "IRC Set Bans" - { - "#format" "{1:s},{2:i},{3:i}" - "en" "{1}'s bans have been set to {2}/{3}." - "nl" "{1}'s aantal bans is veranderd naar {2}/{3}." - } - "IRC Set Karma" - { - "#format" "{1:s},{2:i},{3:i}" - "en" "{1}'s karma has been set to {2}/{3}." - "nl" "{1}'s karma is veranderd naar {2}/{3}." - } - "IRC Set Kicks" - { - "#format" "{1:s},{2:i},{3:i}" - "en" "{1}'s kicks have been set to {2}/{3}." - "nl" "{1}'s aantal kicks is veranderd naar {2}/{3}." - } - "IRC Set TA" - { - "#format" "{1:s},{2:i},{3:i}" - "en" "{1}'s team attacks have been set to {2}/{3}." - "nl" "{1}'s aantal team attacks is veranderd naar {2}/{3}." - } - "IRC Set TK" - { - "#format" "{1:s},{2:i},{3:i}" - "en" "{1}'s team kills have been set to {2}/{3}." - "nl" "{1}'s aantal team kills is veranderd naar {2}/{3}." - } - "IRC TA Count" - { - "#format" "{1:s},{2:i},{3:i}" - "en" "{1} has {2}/{3} team attacks." - "nl" "{1} heeft {2}/{3} team attacks." - } - "IRC TK Ban" - { - "#format" "{1:s},{2:s}" - "en" "{1} | {2} has been banned for too many TKs." - "de" "{1} | {2} wurde wegen zu vieler Teamkills gebannt." - "fr" "{1} | {2} a t banni(e) pour trop de TKs." - "nl" "{1} | {2} is gebanned voor teveel teamkills." - } - "IRC TK Count" - { - "#format" "{1:s},{2:i},{3:i}" - "en" "{1} has {2}/{3} team kills." - "nl" "{1} heeft {2}/{3} team kills." - } - "IRC TK Kick" - { - "#format" "{1:s},{2:s}" - "en" "{1} | {2} has been kicked for too many TKs." - "de" "{1} | {2} wurde wegen zu vieler Teamkills gekickt." - "fr" "{1} | {2} a t expuls(e) pour trop de TKs." - "nl" "{1} | {2} is gekicked voor teveel teamkills." - } - "IRC TK Status Title" - { - "#format" "{1:s}" - "en" "{1}'s ATAC Status." - } -} \ No newline at end of file + "IRC Ban Count" + { + "#format" "{1:s},{2:i},{3:i}" + "en" "{1} has {2}/{3} bans." + "nl" "{1} heeft {2}/{3} bans." + } + "IRC Karma Count" + { + "#format" "{1:s},{2:i},{3:i}" + "en" "{1} has {2}/{3} karma." + "nl" "{1} heeft {2}/{3} karma." + } + "IRC Kick Count" + { + "#format" "{1:s},{2:i},{3:i}" + "en" "{1} has {2}/{3} kicks." + "nl" "{1} heeft {2}/{3} kicks." + } + "IRC Set Bans" + { + "#format" "{1:s},{2:i},{3:i}" + "en" "{1}'s bans have been set to {2}/{3}." + "nl" "{1}'s aantal bans is veranderd naar {2}/{3}." + } + "IRC Set Karma" + { + "#format" "{1:s},{2:i},{3:i}" + "en" "{1}'s karma has been set to {2}/{3}." + "nl" "{1}'s karma is veranderd naar {2}/{3}." + } + "IRC Set Kicks" + { + "#format" "{1:s},{2:i},{3:i}" + "en" "{1}'s kicks have been set to {2}/{3}." + "nl" "{1}'s aantal kicks is veranderd naar {2}/{3}." + } + "IRC Set TA" + { + "#format" "{1:s},{2:i},{3:i}" + "en" "{1}'s team attacks have been set to {2}/{3}." + "nl" "{1}'s aantal team attacks is veranderd naar {2}/{3}." + } + "IRC Set TK" + { + "#format" "{1:s},{2:i},{3:i}" + "en" "{1}'s team kills have been set to {2}/{3}." + "nl" "{1}'s aantal team kills is veranderd naar {2}/{3}." + } + "IRC TA Count" + { + "#format" "{1:s},{2:i},{3:i}" + "en" "{1} has {2}/{3} team attacks." + "nl" "{1} heeft {2}/{3} team attacks." + } + "IRC TK Ban" + { + "#format" "{1:s},{2:s}" + "en" "{1} | {2} has been banned for too many TKs." + "de" "{1} | {2} wurde wegen zu vieler Teamkills gebannt." + "fr" "{1} | {2} a t banni(e) pour trop de TKs." + "nl" "{1} | {2} is gebanned voor teveel teamkills." + } + "IRC TK Count" + { + "#format" "{1:s},{2:i},{3:i}" + "en" "{1} has {2}/{3} team kills." + "nl" "{1} heeft {2}/{3} team kills." + } + "IRC TK Kick" + { + "#format" "{1:s},{2:s}" + "en" "{1} | {2} has been kicked for too many TKs." + "de" "{1} | {2} wurde wegen zu vieler Teamkills gekickt." + "fr" "{1} | {2} a t expuls(e) pour trop de TKs." + "nl" "{1} | {2} is gekicked voor teveel teamkills." + } + "IRC TK Status Title" + { + "#format" "{1:s}" + "en" "{1}'s ATAC Status." + } +} diff --git a/addons/sourcemod/translations/atac-slap.phrases.txt b/addons/sourcemod/translations/atac-slap.phrases.txt index 343286a..33d4b42 100644 --- a/addons/sourcemod/translations/atac-slap.phrases.txt +++ b/addons/sourcemod/translations/atac-slap.phrases.txt @@ -1,16 +1,16 @@ "Phrases" { - "Slap" - { - "en" "Slap" - "de" "Schlagen" - "fr" "Giffler" - } - "Slapped" - { - "#format" "{1:N},{2:i},{3:i}" - "en" "{1} has been slapped for team killing and now has {2}/{3} team kills." - "de" "{1} wurde wegen Teamkills geschlagen und hat nun {2}/{3} Teamkills." - "fr" "{1} a t giffl(e) pour TK et en est {2}/{3} TKs." - } -} \ No newline at end of file + "Slap" + { + "en" "Slap" + "de" "Schlagen" + "fr" "Giffler" + } + "Slapped" + { + "#format" "{1:N},{2:i},{3:i}" + "en" "{1} has been slapped for team killing and now has {2}/{3} team kills." + "de" "{1} wurde wegen Teamkills geschlagen und hat nun {2}/{3} Teamkills." + "fr" "{1} a t giffl(e) pour TK et en est {2}/{3} TKs." + } +} diff --git a/addons/sourcemod/translations/atac-slay.phrases.txt b/addons/sourcemod/translations/atac-slay.phrases.txt index 39dc316..f6ad30f 100644 --- a/addons/sourcemod/translations/atac-slay.phrases.txt +++ b/addons/sourcemod/translations/atac-slay.phrases.txt @@ -1,16 +1,16 @@ "Phrases" { - "Slay" - { - "en" "Slay" - "de" "Schlagen" - "fr" "Tuer" - } - "Slayed" - { - "#format" "{1:N},{2:i},{3:i}" - "en" "{1} has been slayed for team killing and now has {2}/{3} team kills." - "de" "{1} wurde wegen Teamkills erschlagen und hat nun {2}/{3} Teamkills." - "fr" "{1} a t tu(e) pour TK et en est a {2}/{3} TKs." - } -} \ No newline at end of file + "Slay" + { + "en" "Slay" + "de" "Schlagen" + "fr" "Tuer" + } + "Slayed" + { + "#format" "{1:N},{2:i},{3:i}" + "en" "{1} has been slayed for team killing and now has {2}/{3} team kills." + "de" "{1} wurde wegen Teamkills erschlagen und hat nun {2}/{3} Teamkills." + "fr" "{1} a t tu(e) pour TK et en est a {2}/{3} TKs." + } +} diff --git a/addons/sourcemod/translations/atac-timebomb.phrases.txt b/addons/sourcemod/translations/atac-timebomb.phrases.txt index 42abede..914a66f 100644 --- a/addons/sourcemod/translations/atac-timebomb.phrases.txt +++ b/addons/sourcemod/translations/atac-timebomb.phrases.txt @@ -1,17 +1,17 @@ "Phrases" { - "TimeBomb" - { - "en" "Timebomb" - } - "TimeBombed" - { - "#format" "{1:N},{2:i},{3:i}" - "en" "{1} has been turned into a timebomb for team killing and now has {2}/{3} team kills." - } - "Till Explodes" - { - "#format" "{1:d},{2:N}" - "en" "{1} seconds until {2} explodes." - } -} \ No newline at end of file + "TimeBomb" + { + "en" "Timebomb" + } + "TimeBombed" + { + "#format" "{1:N},{2:i},{3:i}" + "en" "{1} has been turned into a timebomb for team killing and now has {2}/{3} team kills." + } + "Till Explodes" + { + "#format" "{1:d},{2:N}" + "en" "{1} seconds until {2} explodes." + } +} diff --git a/addons/sourcemod/translations/atac-uberslap.phrases.txt b/addons/sourcemod/translations/atac-uberslap.phrases.txt index d91e588..81ad0d9 100644 --- a/addons/sourcemod/translations/atac-uberslap.phrases.txt +++ b/addons/sourcemod/translations/atac-uberslap.phrases.txt @@ -1,16 +1,16 @@ "Phrases" { - "UberSlap" - { - "en" "Uberslap" - "de" "Verdreschen" - "fr" "Giffler ardemment" - } - "UberSlapped" - { - "#format" "{1:N},{2:i},{3:i}" - "en" "{1} has been uberslapped for team killing and now has {2}/{3} team kills." - "de" "{1} wurde wegen Teamkills verdroschen und hat nun {2}/{3} Teamkills." - "fr" "{1} a t ardemment giffl(e) pour TK et en est a {2}/{3} TKs." - } -} \ No newline at end of file + "UberSlap" + { + "en" "Uberslap" + "de" "Verdreschen" + "fr" "Giffler ardemment" + } + "UberSlapped" + { + "#format" "{1:N},{2:i},{3:i}" + "en" "{1} has been uberslapped for team killing and now has {2}/{3} team kills." + "de" "{1} wurde wegen Teamkills verdroschen und hat nun {2}/{3} Teamkills." + "fr" "{1} a t ardemment giffl(e) pour TK et en est a {2}/{3} TKs." + } +} diff --git a/addons/sourcemod/translations/atac.phrases.txt b/addons/sourcemod/translations/atac.phrases.txt index aead28a..efc3d85 100644 --- a/addons/sourcemod/translations/atac.phrases.txt +++ b/addons/sourcemod/translations/atac.phrases.txt @@ -1,128 +1,128 @@ "Phrases" { - "Attacks" - { - "#format" "{1:N},{2:i},{3:i}" - "en" "{1} has {2}/{3} team attacks." - "de" "{1} machte schon {2}/{3} Teamattacken." - "fr" "{1} en est {2}/{3} TKs." - } - "Attacks Count" - { - "#format" "{1:i},{2:i}" - "en" "You have {1}/{2} team attacks." - "de" "Du hast schon {1}/{2} Teamattacken gemacht." - "fr" "Vous en tes {1}/{2} tirs sur vos coequipiers." - } - "Ban Reason" - { - "en" "Too many team kills." - } - "Bans Count" - { - "#format" "{1:i},{2:i}" - "en" "You have been banned {1}/{2} times." - } - "Do Not Forgive" - { - "en" "Do not forgive" - "de" "Nicht vergeben" - "fr" "Punir" - } - "Earned Karma" - { - "#format" "{1:i},{2:i}" - "en" "You have earned {1}/{2} karma for" - } - "Forgive" - { - "en" "Forgive" - "de" "Vergeben" - "fr" "Pardonner" - } - "Forgiven" - { - "#format" "{1:N},{2:N}" - "en" "{1} has forgiven {2} for team killing." - "de" "{1} vergab {2} (Teamkill)." - "fr" "{1} a pardonn {2} pour son TK." - } - "Karma Count" - { - "#format" "{1:i},{2:i}" - "en" "You have {1}/{2} karma." - } - "Karma Help 1" - { - "en" "Earn karma by achieving goals." - } - "Karma Help 2" - { - "#format" "{1:i}" - "en" "Get to {1} karma to reduce your team kills by 1." - } - "Karma Help 3" - { - "#format" "{1:i}" - "en" "Your karma: {1}" - } - "Karma Help Title" - { - "en" "Karma Help" - } - "Kicks Count" - { - "#format" "{1:i},{2:i}" - "en" "You have been kicked {1}/{2} times." - "de" "Du wurdest {1}/{2} Mal gekickt" - "fr" "Vous avez et expuls(e) {1}/{2} priodes." - } - "Killing Enemy" - { - "en" "killing an enemy." - } - "Not Forgiven" - { - "#format" "{1:N},{2:i},{3:i}" - "en" "{1} has not been forgiven and now has {2}/{3} team kills." - "de" "{1} wurde nicht vergeben und hat nun {2}/{3} Teamkills." - "fr" "{1} n'a pas t pardonn(e) et en est {2}/{3} TKs." - } - "Now Have Kills" - { - "#format" "{1:i},{2:i}" - "en" "You now have {1}/{2} team kills." - } - "Kills" - { - "#format" "{1:N},{2:i},{3:i}" - "en" "{1} has {2}/{3} team kills." - "de" "{1} machte schon {2}/{3} Teamkills." - "fr" "{1} en est {2}/{3} TKs." - } - "Kills Count" - { - "#format" "{1:i},{2:i}" - "en" "You have {1}/{2} team kills." - "de" "Du hast schon {1}/{2} Teamkills gemacht." - "fr" "Vous en tes {1}/{2} TKs." - } - "TK Status Title" - { - "#format" "{1:N}" - "en" "{1}'s ATAC Status." - } - "You Were Kicked" - { - "en" "You have been kicked for too many TKs." - "de" "Du wurdest wegen zu vieler Teamkills gekickt." - "fr" "Vous avez t expuls(e) pour trop de TKs." - } - "You Were Killed" - { - "#format" "{1:N}" - "en" "You have been team killed by {1}." - "de" "{1} hat Dich getoetet - Teamkill!" - "fr" "Vous avez t tu(e) par {1}." - } -} \ No newline at end of file + "Attacks" + { + "#format" "{1:N},{2:i},{3:i}" + "en" "{1} has {2}/{3} team attacks." + "de" "{1} machte schon {2}/{3} Teamattacken." + "fr" "{1} en est {2}/{3} TKs." + } + "Attacks Count" + { + "#format" "{1:i},{2:i}" + "en" "You have {1}/{2} team attacks." + "de" "Du hast schon {1}/{2} Teamattacken gemacht." + "fr" "Vous en tes {1}/{2} tirs sur vos coequipiers." + } + "Ban Reason" + { + "en" "Too many team kills." + } + "Bans Count" + { + "#format" "{1:i},{2:i}" + "en" "You have been banned {1}/{2} times." + } + "Do Not Forgive" + { + "en" "Do not forgive" + "de" "Nicht vergeben" + "fr" "Punir" + } + "Earned Karma" + { + "#format" "{1:i},{2:i}" + "en" "You have earned {1}/{2} karma for" + } + "Forgive" + { + "en" "Forgive" + "de" "Vergeben" + "fr" "Pardonner" + } + "Forgiven" + { + "#format" "{1:N},{2:N}" + "en" "{1} has forgiven {2} for team killing." + "de" "{1} vergab {2} (Teamkill)." + "fr" "{1} a pardonn {2} pour son TK." + } + "Karma Count" + { + "#format" "{1:i},{2:i}" + "en" "You have {1}/{2} karma." + } + "Karma Help 1" + { + "en" "Earn karma by achieving goals." + } + "Karma Help 2" + { + "#format" "{1:i}" + "en" "Get to {1} karma to reduce your team kills by 1." + } + "Karma Help 3" + { + "#format" "{1:i}" + "en" "Your karma: {1}" + } + "Karma Help Title" + { + "en" "Karma Help" + } + "Kicks Count" + { + "#format" "{1:i},{2:i}" + "en" "You have been kicked {1}/{2} times." + "de" "Du wurdest {1}/{2} Mal gekickt" + "fr" "Vous avez et expuls(e) {1}/{2} priodes." + } + "Killing Enemy" + { + "en" "killing an enemy." + } + "Not Forgiven" + { + "#format" "{1:N},{2:i},{3:i}" + "en" "{1} has not been forgiven and now has {2}/{3} team kills." + "de" "{1} wurde nicht vergeben und hat nun {2}/{3} Teamkills." + "fr" "{1} n'a pas t pardonn(e) et en est {2}/{3} TKs." + } + "Now Have Kills" + { + "#format" "{1:i},{2:i}" + "en" "You now have {1}/{2} team kills." + } + "Kills" + { + "#format" "{1:N},{2:i},{3:i}" + "en" "{1} has {2}/{3} team kills." + "de" "{1} machte schon {2}/{3} Teamkills." + "fr" "{1} en est {2}/{3} TKs." + } + "Kills Count" + { + "#format" "{1:i},{2:i}" + "en" "You have {1}/{2} team kills." + "de" "Du hast schon {1}/{2} Teamkills gemacht." + "fr" "Vous en tes {1}/{2} TKs." + } + "TK Status Title" + { + "#format" "{1:N}" + "en" "{1}'s ATAC Status." + } + "You Were Kicked" + { + "en" "You have been kicked for too many TKs." + "de" "Du wurdest wegen zu vieler Teamkills gekickt." + "fr" "Vous avez t expuls(e) pour trop de TKs." + } + "You Were Killed" + { + "#format" "{1:N}" + "en" "You have been team killed by {1}." + "de" "{1} hat Dich getoetet - Teamkill!" + "fr" "Vous avez t tu(e) par {1}." + } +}