From 9f82140d3aab21ac76b41a57516be56eb3e6bddc Mon Sep 17 00:00:00 2001 From: lechuga Date: Sat, 22 Mar 2025 14:21:21 -0300 Subject: [PATCH 1/8] Overview: - Restructured the entire plugin to enhance functionality and management of casters. Main Functionalities: - Caster Registration: Enables players to register as casters. - Whitelist Management: Manages a whitelist of players authorized to self-register as casters. - Spectator Immunity: Grants certain players immunity from being kicked. - SQL Integration: Supports MySQL and SQLite databases for storing and managing the caster whitelist. - Voting System: Includes a system for voting to kick spectators. Commands: sm_caster: Register a player as a caster. sm_caster_ls: List all registered casters. sm_caster_rm: Remove a player from the casters list. sm_caster_rs: Reset the casters list. sm_caster_wl: Add a player to the whitelist. sm_caster_wl_ls: List all players on the whitelist. sm_caster_wl_rm: Remove a player from the whitelist. sm_caster_wl_rs: Reset the whitelist. sm_caster_sql: Add a player to the whitelist in the database. sm_caster_sql_ls: List all players on the database whitelist. sm_caster_sql_rm: Remove a player from the database whitelist. sm_caster_sql_rs: Reset the database whitelist. sm_cast: Allow a player to self-register as a caster. sm_uncast: Allow a player to remove themselves from the casters list. sm_kickspecs: Initiate a vote to kick inactive spectators. Registration Details: - If no argument is provided to registration commands, a menu displaying the players currently in the game is shown. - The commands accept either the player's name or their SteamID. SQL Details: - The database stores the player's SteamID along with the server ID. - Only players from the assigned server ID are retrieved. - Players are added to the whitelist. - A command is available to re-download the player list in case of discrepancies. Self-Registration: - Players on the whitelist can self-register as casters. - Administrators can self-appoint as casters even if they are not on the whitelist. Convars: - "caster_whitelist" disables the whitelist, allowing any user to register as a caster. - "caster_selfreg" enables self-registration commands. - "caster_addons" enables custom caster addons. - "caster_kickspecs_inmunity" enables a list of players who are immune to the sm_kickspecs command. API Enhancements: - Added hooks and forwards to handle casters, whitelist, and immunity. --- .../plugins/optional/caster_assister.smx | Bin 5695 -> 5916 bytes .../plugins/optional/caster_system.smx | Bin 14046 -> 30615 bytes .../sourcemod/plugins/optional/specrates.smx | Bin 5969 -> 6058 bytes addons/sourcemod/scripting/caster_assister.sp | 14 +- addons/sourcemod/scripting/caster_system.sp | 2404 ++++++++++++++--- .../sourcemod/scripting/caster_system_test.sp | 714 +++++ .../scripting/include/caster_system.inc | 68 +- addons/sourcemod/scripting/specrates.sp | 2 +- .../translations/caster_system.phrases.txt | 293 +- .../chi/caster_system.phrases.txt | 148 - .../translations/es/caster_system.phrases.txt | 296 ++ .../translations/jp/caster_system.phrases.txt | 149 - .../translations/ko/caster_system.phrases.txt | 149 - 13 files changed, 3350 insertions(+), 887 deletions(-) create mode 100644 addons/sourcemod/scripting/caster_system_test.sp delete mode 100644 addons/sourcemod/translations/chi/caster_system.phrases.txt create mode 100644 addons/sourcemod/translations/es/caster_system.phrases.txt delete mode 100644 addons/sourcemod/translations/jp/caster_system.phrases.txt delete mode 100644 addons/sourcemod/translations/ko/caster_system.phrases.txt diff --git a/addons/sourcemod/plugins/optional/caster_assister.smx b/addons/sourcemod/plugins/optional/caster_assister.smx index 4ff651e0c61355d8b866fd46a3628b7f029793bd..a00b81f6f18fc8a857ed8e3ce5e864db8c69f00f 100644 GIT binary patch delta 5746 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 aF!?Zka^Wa8WrZbH|3~DhfaK-T>Hh%@`#hKc delta 5524 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

ikPz!y5zF@(Ha@`G|;)_Jycilt^eH%j)W`35EO- zow`#TMpNYmQ^5<~F+oMs2Fgc<#8*x09PE|4Ye6w;9)Y_G2g?JUDUJy@1FUA7Ql+9y zrG>WKMmDQ;x^!ZvS$Y~K@@6-5w#!tO%qEvN9o zQMf2Yu4@slHC4O;t}Mua9%hb{ziFD|IS~)Rsd#FTT1_PrO@PQ{x#*_P5jHOTfxE55 z$FKJ{MMG@Vo-zU5+_<^*`Ff}3I^dIyyWy;t{k&@2v}G(SFol-==%ua73?i#c_Ewnv z4ED{Q7u2afR9V$O3vm8fR_*A_*?Os+lDT_dip@hqYCnQ9?2s0}Lo&=DXYns2s$F+u zY&VlOjJCXQ%@u`bys~z4xBNBKluh)qZ8$3{lr3Ab30aZk{H6;dhI~?)a!IKR6?CP)h{%v9}V^Dh!!fG+ior^xL=(mjFjyi355I4>0dAZ=uT8qrgybb zax_#tWJrqRPa8XG-0i=9^C~16!o7{KRkox~xRZBDC@&s3$h1P$IFjs1Yk51TIyp1z z<-p>VE~zpOh24~IyG*$!d8@>SD$5HBDV)jhf|ZUKx=WI*4laa7;AAgN+oe-w`#lM? zvW3-`whq+ArTb^jx3!D+958sPd7T=mOqA-AFZ}K7?+x}n`SMYf6r(~3!ZC?+Fb9`7 zz$yyEoBSxD(L0z)uPY5gt-D5Bnq;!Q8fs*LCR98T6Cb>qM=UHzdG{ zLt^FKZO7X;FW|`46w%co%`5HwA3UCzxw(-bPFUMmRr-koMCM3Xdm^`R)L!Ub0Y1@g{xs22zYOy*`#7+SyfdI;xsf$g<42Kz{)3 zYaL2zN8|)$4$#Kd7`f(?OHCYlk80qpdMw=bUn+LHi16|724%Xa(i^ohOYreXn%u30 zWfN}Z0NPqVbX8V{i^2t`xsEDW4*ymH%&b1;Y+b&3;dRz-nkx6$Hh@Jq*Gv?{2u6pcw1h@us`*(J+2_0mRFhz+r;a?=z+ZzT_nUW08cNbhwOLj{aHAw#op-alu@n&JT<)xYtkl`T2KBci+~ zGKummnbzA(FLMr%PBE3}=bM*_T+EJM{2BdzB5Z@Bs=RA8jAwRvX``*<^ohnT0&#vG zOEUzU_MX@?cw-BcR?B9zI4APdp}{#0XMCFR0Dy&fVC)$}D_&S?!0#~|V#+K|>dDY= zx|H7gquiH@=wecPb=3W5^V`-^OS{&v&HMXSqk!0xOd;%(OhE?kWe%oa?bJ(kf6OH` zJGUpkAB43kTaRQD-*=Pk5h}_{wqLkbuGY!rCaVdy2`mtL7?m3iS~)w=$>h?qQv|LJ zUn`d<%z>8k6s0Clc_@r>UXBy#Y1t%Nn;4nusd|G9^c=c`q;fWwyOz4nHXF7BT0&^0 zMt@`6=6VxVjd&KE2yLFzn7M@iiW>-xi9%Sb{1WQ_zJOjjUz1X9V{?9FcYwCC#)4En^HF^?LRq zyUf4P2_i5kkd#$sz;>gaz&q~AY+siO@g2vYdSDr0IbRc38d zcjemY9t=&>1n81)gDq7&rx?crh6_FA5d!D%?>BVm$d_fV>ID3sqa+N|d?&NVIr>Na*K3F&B&-8Pu@i*%g0O2LR6@j$l<^aZSdGavZ7V6RN%b226BUUJ`TCr z>Al2PQ~iHTbAH<4k8O>To(2F^ibmR}Dcq)>s6P>kjST zr7PU0e)rUFQZ#!UYNYjwhhrOb21#e?0oQX5n+TsZlr;|Kv=W(FuPwmS)Y8R8G}8hK zwo=&AlLoi8E5Qwd7S63vTj{mRW#}nG#||Whr#$egqgvTlwdJ!U)?{MD#(Xt1}e-ytXdc9!2jlrl8A5JR{!2`lK7(rDRrikEV<_Hv0? zn+>?bEMH&V7{6Q!u;_NDA~3pe&Qy0dmo` zCoE5{$jn^ewuN}ECe0yy6OKeeh6g|85CPQ_cEhRS?F+<^hqEiOEliX=Ia3RPkA2Fd$rBCCpVWd4LnOCVt1msUAF%ImYixQ)N5w5$Agmx zy-jdHjPLTA-br4+L@}bVM9n+qz%kHn$vdV&c)n|Fw;b|14@ZjCs@nzvsY#oMWaSkK zpa+lfyLEv*9e$umzV*OZ;d|_@X5Ep%_CH1$ahl?HlF;MqUeW0HT6J2V*!x0;VS-VjG?^eV<{S00WVs~n6`tE=+Jg~X66b_wA$EHOak%m& zNV%2hZDHrQOR`sqz*gs5mt^FNbc6@jYG*lGV+@grzHjb8zplCR+X)E*sNE}FN@hpl zCLrZ6V8i~ka|d6Lua9|h^9Q*7rm~(Ol^P@&hHsjJ31W^SbdfUqNL{N{zxAH$I}Zkf za=_!!eqTfCd7Eu%OlB{i(9nhDrTD7NmQcJARlcKBcxd5;TFa1+vl_MD_JtagA`fi) zxI~<#gDtVrAFQ@}pnVd2dFz=JBk^dy+9j?%L9!WO8|R-(HGDZux{W$uv_G6|vq$e2 z%=G&VFXwax*)sb3nj*~d9D^z*6hcf>K~%}NGL{N`V}xDCt@2gCXz^Ad2iF@XFHj<` z)vDbWBk|zNCh>YM47Ebzg{c%kxC203G z_5{iYHw>Bc49dRaNEAk1=5Mke&1V@hMgUVJQ*Q z%!g3l&+5+`KAb9(hx9uK-kP5WHpHJwj_|gtuTL_2Cqus1Y*%s(->_!WE(tS_@O5*U zn3lGmW4s$f8fnd+vdvo97LZmH2cL%htZRI&j{$JmWUH?xzIsaRXHA`8I~wy$4h=d0 zWW|#ykfc=5cV4ZHt-uBa^3isHZ>555shwTZ0hrV5G)+@mtAfV1BPOjF@JlsXGj72F zJElEBRThp3C4UovVc-5YFk1V9CJ+3RRM#19`P^D)xjH-a>o#4-$O#|)j;w9p5R{wP z*5M?TYsb1!802HX>D1W-%9P?+fQ)ztb3xXfHWoy9X~v=I@dN zf`?`;oFLWXTfkT6X8u9*u%xM3i<-Dmdpo4hG@3mhW7C2ZeKQSSwsN&~i$C)uSP*5y zIHX{Y&iIXN3j!Oa*h9ouUm`=^hmuUxk=m9^m{Ni$}vrFjz{ULJ*_^J5UO zRtb%X#ngR8)UOXlXl98wQ0H-^H%XGPa>!&C2S7x~{HQjgQtn|~N4d}T44KYM-!;DT z=km&*@L9G?Iw-2AYE(p&IHDK#b6h{_L3|uLo-i5GCf`QaCD$1)HDCH7s>OFUJ+3;^ zRtT6fiUUm%{>dx4&pg+Kj?M-Z?g4uOCXFE2%?-%+NKN&dbZeZ{pQKZ> zI4?VJIJ{G1D@!T-NSQ+`9fCT7_P};;+URy}Hj&@v8iOT|ygxLe^{S}7XA0y@JKIfE z+3hd(m&YG|%?$5vhc=NFo~aj(?FoseO)b_9lftLDD8HR^t)o6UjI-i`qh@m`#r$fV z%coh~GJdT%S@BxJ@$+nQKKx_X3m-w01oqNektgU3HlG+vl`~RaMd{m znm)CCht>rZ>aVGH$O{X{8u=3TCqdARB5v9Uy4=Da=M)K$LrHrQQ!(DqW5)nM+G6E_ z_4dw}8X{vdRASzsNR+sKz@fL=U5@X!bzTNB>c*QwP9pBy#jBl)FSC_9wbS?8 zYFi==A+CZ(vA~0o?Mg3XbK~*fV*voq@D;V3k740ZhWA=y=S%C%ZkdiG)zrIO{9`z` zvh#aU7>YJH+qKoF|K3GDBi%M6Rs00c!atMib!b7Mq6JtcC|H0qKPdx&RKTo<&Fykh z5{-IJ{}jnfB1s7e*HY?KM$mzJgD#HL<;h7Z29V|t=86wD$r=Zo?U2Z&ZJFzX0=8c@i8-uLw zh*)>WBt)*QS^W9!qSV;>W0~vDG;H`<(#pbj`pcKu5&&B??$(fYW8fd2lLk|w_uaoy zr}hq=x2wD~#$fqUb$Fg^0EObQ{}ZuIXM&1@YuC)w+X5#EuFI{DiF_>*w54dUVw9CP zCCnrXYVQ=j%5r%$ni~2pCU4q{sL|taC<*t~s_WMggjI192<&!@a26NB3J5Y`Ym240UnHNkFLMeut#vT6w{ zYak8z6+sw3`Q$_Mz28g#@TP2T&6er@CQ{EAcvF%N*@@hOIi7~{HFxh~vjL|g^;#gt zAzy-ou;#c|(Y4S>vWU{H%->R#S8@NP!$cN$T#;(d^h|`3+LPG9~A&lc1Z25U%zbdPSsSwqB6GXAi z5boW`2JWpp%pS8HSPE*TW_^LyHBrB}Mq)hiG@)q7CKD7r$@3ZwDjr|&s#_y`12>65 zg#PX)Twmmm*=V5o0OvnLAC^X^Lb36)7O~?E%LH}BzGA0|IG&3ooKHQ}#`h2w{ahb8 z!4i)ibj5YspSnK5VkM|`O)JEpU~C`>M$}R9C$X<7GFwn^=(5E9$ zz>=+PbPW<9@wjS<&&%YS3d*R_`n|?G-WGh@=NKfEFHf8rToYZuu;?+(h$nG&6&9%$ry^+1P2>Ex$CwKFp3I>E2lpeX}CK=Yqom79+k|TmmHr) z8o_7NyI_8+CEIs{d~=6gyBOrqx!1QjP-H6D>8u|<-$tf>Y?_d{_6a_pwR*>wVk@L& z&(9D@-VG{&1&Y6E-XI=^bzk#zBKHFqaw;1O1a}W=Y_%$rTJ9JBI*F^(0S<#dB9Nw! z3r-8a6rA2uZ5*5(OB*gxS<_^kviU0PO*4kpS>9gBNwXD-vz0Xv zJKl>&f4K5o00%oWLRuxsVYs?Vmz;oG!NeFi4)IX`6*gCQ^)&7bCd~HCmTlMfipJge z#<<6Bt;j5QxyFbpwXbFWim|2_moXn&&@Yz&T6OpsD6)FXfe$(QQktp;9CvP()LwHA zN|aeZT8q_T4_ACp-ulpbMmZ(HjQ)71ndkiE=%m5vZ%}`b$+AP8ujb*XEj2F%I{8#w zqmUHduubR1hybUI%`U{BFz=1BPDYnEbE9DfKn@~h>!LWOQXviH_)-4hF9~AV2?jrR zgwVR+=o1yS`0Rd?8YW`{lX2%#r z_WVlHz{t-Xw!PZZ$4UZ+DYql_Aaa;Ft)t&+y1G$siCa{mpSt2GK3AOlBm7;p%gu+{@sKGDni;PJ23^?OgT*$wc(tG;0_X z{|X+fk142KL7zQlVAw%xkgx3$$cH(0m{hX?e=clSlx7{JL>HVFvm%e(1 zEk%W0Ec~1&F#NbXsymUyI`!A1E0S^Ib^St8O92)0U7-848HsfgVA8`{z2t22$Wg6- z(~4XXp^exhH(B)$90yR4~CfI2uJ3&eTF4=3x4*wd_kNAd*z|xXV-- z4wL}W0fW0AJXY`D?_TP8no3pM-kzfd3#x^IJom>L2b3&jprD37L2BNnu@IIUbR2Vt zDR5aZWFf#*>P?2ZJ|crQ<<~p@#v_$_ zh(dNygZ~W$TLNAx82J9COMC;FVX8olr&a8EinnlAZN?7yz5>ilOqjS~TWq!A%DBpA z3|*U<+gtw>y$_e_{@t~F?r)xS7df}PUbR2RWR@NhZNlzYyv<`I8j{~(G*W4-)TxGW zH3`_UJ-5zp@ULoDvuCu;1yDlM$~}b4cx>ghk{fYY%0>Qa9^G06F5`eRuhz@?=u&Q1 zEz63h?{$=2&ecXue{KZ~=-K)-f@fg!LfM{35tCA`Cka>H zA;c|(AzurMz$|>CKfqec?%*W$CuWFA_VxhhDxi8JYidkdk|HY4j!;oG; z`Awd7;m2V!T|SUx5oBjXIo?~O+tfx#UXY6Ap#X(dL0?Wm+bNpEF)IcaYX|`2opOmr z__ixGOZN|FWfhdmr1IGbgdt<^t9I1CSDEo<_1W;UdI1j|Pj*}5qKDWpcv{wdWbZpV z1?=D?KTp3leBz1WIJ+p``%#l-=b?cx>v)9PhnQN6U8XSl9F~`;d5AQN{tN_bF8$Ed zkg!{t=crs--CwF?$~R?K25s}`3;BdhYHFgpMH~4>(6YAbMx&7=RW&-PU>^gAy@9b2 zXP=~u>DAgRpaJyH0o<;+He3sUY+fz$K^`HuhIEw-jVr;KqEl8P_(cZ zvIOP|*cr7Wx%n9Edrxr$5~CjlYbqkyY0O|c-a>5MLBnRBb13Ny=YM^I0K#9c0OW_3 z00~|@+7lNQGxzbQMtqdjx%bkj1ojxrPAa&<%Zab}UCe}&H%o%3Few0%$G8h>&Yi2rYEWRd^+bQ-C!t*n$@gTZR^IDU(IIw9f~(G)l(^e~S#|Fu#6 zOU=%FPQjLWiiS2BTYcXvAkz32gtliJ_e{P2Xpgu{+4pxa$qCjJ1u)%zNfp>ZKN~-^ zvth8Zs^&A!$w~O!Qm3AqFVoQQco`Yn%=LKz5%cSDL&KiGw&IEKY_w)Q&qbHTgp2{O zANmjFbO;8azsA87I**t`GKjNnYjKpXa^6TNB2q$y8C-bwJ73zG3FzJ_<>D4fN%`C< zp(pH&%i-PbqSY2Z8V}(F&y+4!cy2l~Sq`oD5H*(#+6&kM7>8Sy1L4B*pd@8X!OoTu zke_4nSEv%`iL+10=Uc{?uvJvIz9>t%$AA9~HGM*>IUu8%_6u;v%6WIcpABNCL_70g z!BM{wux6*tjXJf#3CU+4DL#Yx3)GW zK~LkwfGJ#Ua5|!`SJSjHOC9`(xKB{SyB7JY$bQ(_1bf^Wqm6cc~!mwh(ue z{;4X(?H?fn{hg2|*NYPo+4mA)zrn01%o^U^osE4-{E-(zeUxQGIAb(^PdQUaE|s&2 zoxeb;oLz6b1#f>_HsSI86K~P*`Ng_cDA-7tXJLVMn^)B(5d7CMcpT|qVWzC!o21)i z!=L4OXuWhpM+xtv9B#^?V~iR_YCGRaKdh`Jq*U%&mjq2}po|H>Fg9HQrf(trM~b~N!Q?OfS!I5K%(z_c>c;%;xHoEA z6z>J&y|nLtb@E9; zlZNyyUGn&dx^AoB=#b3*G=?yiSugRb zq{^CiNi6Ubo7#744D;t66;qHyucJ3OsrVU}?Y+Vz@GqmOn^T4^^HgV-negpY@0HOG zG^;g@@YYa_?Zcp6eLvriD-)WX#N~;*`a|k&mG2W?*2+n;)A+E5CJ%95sR?8_E9f&f zxk(slRs}>aQR}&cS7|O?oOmpinM~ZhKT8w}?leZZ2X$^|Hz|V?*E~8eFu7+d4N?O> zyoavK$hg5p-8)UAOJ!%lzgzt+luF;C$CgJFxDP|A*fUy=gzYv z$ysGD=%6wtkiy3OiR$JL^uCm!Yi?C)oh@L2>x4OQ!ltXj)t2F=xY=`fG9L0r&dW2f zJ-A8SSJClvyA=OgVanc522HU$I5kU^OPr|n~ zJ`}$rIz>Vgl;3gpSKGPOQ)QR9TJ>s7i%q5>*o%Xz9uEMFx5;tIJU`!tIXbgPJ6fk8 zp_iV01{|7Va50Al)5f7q5UCP$UvhCjC@^QrI+WN9+#xc9+I((F;{$9O+`EZ%$DC`8 znca6AKT(Axb#|VUFM!3EW?S7NZ&t)05uwqlSBUZ5EtKoUo=-H_6@16DkwFd|dd)mr zYNO^P0g}s`e1A3SXP|JVe(!M%K57yi&oZ4nyu$vWYRBy#@O!zS)Gg90ijB)VkkDI| zS#jA2PHDEh+?9NLnD^yFO%;Lh%}x2PFjHr3=TJz9eeQ6c-Vxs1TGe7@R;`vb%(+XA zsr6vP%mAop4dc2a%;yv8Kr$+dh345iIx9Uqb_&$W>$#p^T)uE$#S|{EZ0+8G)i7vU z!vJ*ZB5L2d=ldz>_}5Cx2WLt4VF|$8F7jY7L#pCkow)fs-J>n4yOy}4Q@>8KyL{Gw zyWgw{YT*K!8~56fvlFmtFpbon@WRpc6|5hq!vPjFwH5P1_UE_rqVD>vTHF}Ow%~tV zHxH7JoigTgP``RUnE+4)3%U|TGWSO9PO^z57V^cG{?oD6N*gmw0|UyjcySsy9};feiV4*gMuKF-7AFv`&v@aAdSI^kDTboQ`FP1nGG4Lr};E%$wpmz z={nqc)bktmT`eN0HM(WqPOXK z-D176U%*8rhvee5C|P1{Dci{qX_0xJ2Ec8)V8PqV693Q+Q0JWpUcbs{11Ld z$uED^A9pV~SMKi4Cmu=Df-Op}8WKpuFQ-qT~*5nqUUc zz85~rH!NQa>{062yXG6x=R7s}m~F{Pj^r*L<0Xp^1bp80%S?w3#S3mhr{a+$27=t` z2hFI~w_jX+-f^BMW|RWabO(u^uph_iY_OjGr3c8 zjH(5Vg9Yv$UpmbM1y8}9&e~5>zDkq~rq8N!YQ3k_J-E;cyG`k4dXWM$A~G4JJ$rw5 z^%cei+D>2L775n5^6?8M28MdR>9zF1lY*DnMt5o@c=cB=F~>r zX541r=I?e@Wh`~lS}?;Ttav=BN;YZG3sS)}DxThBFvz&zJ(dmH9Om6oLElziNL)@x5WHX; zuvkOB8DZ#m>nnKUfJZOjZ<4Q69qm1HJ) zry}{rMfFX+Ox)31Fj*_{nYiYP<=?`uN0DNWeV?3C8@EZ+hckC`efuC*jGOa(!-eOQ z#Qg99i>K89&GW|}Rk_skw44=nre(fekpVkr_VA;#kCl7~x8E4k8cP~u8$Vl7YGZF( zratfLm3EB~PkL2|)M+dJRWz8>U8+!pMHyH40c^X(|= zznS^Or4>qnf1P`~pOYiCPav;7pe7y-g_dBx$OpbVe)efu^mf{JB2nSPJ@@wN#JSX& z3gH*X5oafm~yk?@$C3_D@x$a zWbbn4$=c`lGusy(IX-?2niR`#3+ca^{1T-ft{`(OCS}>b(EO@?@_W-Hmw)B(LfQS} zx1w3NO&uBhQGVd^n~tpM=Gzs?RuvpCJfPI^3XQ7p_LZ2)DRW_CA5k+WX}M=$Al761 z)wjV%UK&<~5T5C0lo_o|5e=dPD>_}US9VA_TFgM$@~2IHS;g^ILXM!)y|;i4zb z@gLgXU!!??Vn-mt;IWeU#pvly1&NUVbWsRE&zYpu&DVB{{3)J^NFsbn3VPec&2Xj= z=$4&G)ayK&`HDkS((ROx9p$^R@Ijst1HGF0$QJC7U!hy**_vo}#syAjei_3P!nXG7 zPh8T_=4WK0toceSC)w6kvzTJJZ?%b{237nZRy=Ejw2H8iG%sCp1xpWMq3FHC z0>XE$|40P(t}WD$3CF$(NfX|5feg046#j_$ZSs{WY&82B#Ultl|8|x z-pPKYY;1nNY$DnCzTb}~u-k#O&y9?)Vk75^lLOB)->j+J~G%lj<*hLR>Xs z6vk>+)Z*L}zZ(r&YK+P@mT7gpP?O`)VKpk>TYE-v5SHA+N;P2KKAxhonas(e;bO=f zi*r^Tdu5lckQ$v!d-NBs-}@0%U$5{&iSXqkx{aox7az;o-ZyCxJ4IiZkx)HuVh!Vw z<((tOj+~Zz6c=!Wi_0d`h#DAt>KHJXK&7}``PkBD)@R>NjB_TQ;9X3U7A|F+tNl8! zL(=|l>}jaMYlcci5zDP)_9ynozqSGTh_mThR5Wxcvn=#4md!}`%-75sxaC)V9zJm_d`XO-y+M_`BZXZpaV z{N*oQ780M%?;NjGU6a#u-KT-`iX~ZHC1oWW;<**Gx=_i11@k zyyI$|rnNmn`RB)yzSWhb38(l!qvza3f)6d|LJxZI=>CZ=Ar*W6N}Z7eAJ%N8m@B+_ zVCUZSWEn6QDB~^J%71M7k%GGpzX^Ah*!7=$i!)}OGp)V;qWfoU-2ZlFT?p0gMhbFA zU+v4p{e8AV52@V=QE5F4KV4|XToFpa8JYjE{b!lfNk6}sVis-PVMW(5*1~aALfoyR6z(lW zIFuok4c|0hEuJ7B=Ux1QSrZL9q#Z-cPArl?P@Aw4Gzuvl7zy6%-)N0DzG6r;+SJ>9 zOP3&INMp4@j5e+EkRKQ=_#pos)j~Z_`}8c8t%G$J+uY%?-fzwMvG=hMmpn%!I z%d6e?4I6Z3&Y|l3@=@UN`EJzSz)0_W)0o~T#qSJK(F6r)XMX}(!KI1TxCY~FQU9nR zgdyG#W5_=jX`I8mW|-3R8e_RmsV~u{P`L&#!0ZvjtB;B!be0>nf#l0nkBBSP_g6ML zk3G8&^Bl~N;pW6w-!JMkFha|2x85tQ)AiTDVl^Fm_7srHQyEx%?Du}R?7ip5IT+F{ z$=V4W-zpX2b0}Rw=LT^krRluz%I+Pm=t|c1qp0<2Cd#@GLQYS=*FAhWG9yHqA7A9_ z0ZSAz;S{NstY)rCd-d=+q_*zoM>Y)~07+!dV|?LOVPD)cpAp=0=Y()^e7L|USr0^E z8TCd`J<`}TQw#{L_ULbLJ-#w=hb1p(b!_XO)9AHQC&f2#lF#i`GjV>dvy<}kBQJQD zsrxb4#l7X!FJei8J5jn@1&vxJxSY?WJa!ZoaN153Gvf&(Ula!Z46g53lPnZ<{}x>5 z*z-^Na2Siq$vCwiiw1@6`nPzoSNc5?JW=-J-AbujD@g;daj6(S0usB_s4^=%ekIU0^;> z!wJ6WG^wRr2RqID;hX46%JL;hiMFTFq?M|Mh7*VT*DIK5UeZ?}%=$Ab3wO`e(?kjs zWEc*z_O1s7wwa1zNZt*5*;QZSVKQU#Kl_BH2T(lC>H3o%~%G!tvF3{QIC zxc*Q<*;ZZ8fNaQ2uw=$TLzwE-$UV{qQ zdO~udifDkJ-b*faA=xe~+^xg)aRRkbP{PUJ)@X&h?=7-6$PhTpgh&c$96rHkkY@kH zxP1{F?C@lR$+Is}!S<6uql3gh@a}-4WmHr^G52!iI&kU8fth9obl4M> zpz0{RUVS<5R|9SGx%;UKJ$`sS#=uBQoK&X22ww5z7!8d`pSF4x2}E+% zyXFt9$eV6e4W(U~XfpDZ(|@kGwbFUY&+f{ku&-(~({pEDS^pz(_@>^RW)q7_n0@3$ z{ZBOwT^m*hHUXAq-p2BV4dSv2fI}t@ zWId{rUi-jPf0h=D5D~3Lgp~vpPBeG@V7vo}bOH9T=I0}a!H31qa@*m|J6OKy*^c5?0YhP14|&l4CB zGfr`9^b}m!<9n25B7C)al}7aB%ru1Hr4 z0=EG#w6(-IkZb>|#x-q221aO`xBg}}7V)B9`u6?r&qA;mb9ob&^7E6~emF*DrxDgz zx6zq5@#u&xh#l6b>Wg*Ve@AZRByBspCg&*j9ZB0^Msm94g~TGc=REPoR@V}rgTHc5 z#Ncka6o$U^^|%$g#494WD|z9UpAb4~OY6pTcU7Jcirch22##!D8U!<3WhI1C)z1zh z)w^i2!h_Zvw*t8fThF?wC9Jj|b%3n40;TVJ29YM1vu(^r2>FQpbnzo6yF`Fl0{#g;*kbHzBXwzFa4Ijk{ zoe1ZM=)`joTw!jLk5omuv{kN4K84^RJ=^ZT<#HcS>-`q&eY{@qRqP+++cx#SV1mpnf*IH$qF4JU{HW{AdKQQyGOa1)4!a2Qh<6ReQE=UI8_2LC4Z9Qmvbunxk35Fx4B zqpAh<~86}oli zQZQFobp-U$UIbKja=!CjNFBkfIgyGPdvSKk$V^!Q0Dq{UbWfqgm9nTCSkCZK$@-4a z^|MKMt&>|z)xFLWW0(2H;ckA^L4d7o`FmysOGB;TzKUk5h5Ar_xvGTR^a|#Fr&OYw z7`?;x=T{Cx8Wu^1ie%zXf>l8z09?uO!HU|d$P4QN!lIDdl@AOi-YiPggSiVPU4_HU zOows*gue+;bnxeVUeIJs72-47r5O7ncgY^U+%m+OI>!=v(WAxWb1@8-ZBB)LGdZ<16HsSfPl=yv=-LXSsc(9u=aUyN{>4X~}3 z+{Bk9EtQY$c%)OyRpnr~mH6(yDuXwuw4_7*gq59(gWbn(AZSXl#a8K7%MWOn_1DzY zPp_*hvgpUqfNt~8v}D#9vHIsC@TkNqQAyn0s&nrqbM75hLr|DU-1xa{6pB2tCliU&r2G(>egFfpR(n^+2R@oDxl^5K8As;#5qQ5)qBOH(L~sh9c5Ma*2AaQ$uWf zCAOltDKjHo!*JyrNg96;n4Q$)RAV4ger?{qih=6S2YG#a;%c@(MRo=T#eEd{Q*qY> z0@GS5rg&k2*;uiyYn=eikKJ)Jomu%+8QEearhW%=bQ(46>q*)XkJJDTU7I$h?A+X@ zx`%EaAsMv3M}$nLJ$u!yab5y?WGYExU>e3Hx;l-w8WxfyeBM?xl<}y4CSwhwkv|=gtGTFm_3dA=nD;&lf=!P$bswBSPq}n z^tNa+)1_x{oyU2luT4rnl~!~x(=k+DDWqhU+L!d?MDyUhDPH&e$wEk~J|}-pJMgQi zzP@a#*yX+BTlTjvVSbLQA+?=))6wPSn|;?@j;nZ|IAsdGl>#B|_-_k{on>Q4RZR*r zx9oYSAI4*3gfZ$flEXVGvHZ&dp9K!#D}{tAXOu&N^5nKJCzpX*!`p{l&xfE=IkUHX zBUp#J@MAYr`VZXI0TcLDbT?--eX#`!`1B0$id=5=rSsLbJU->dkU#34)V)Iy`RE+(xWJqHzPRU~6TBwG@a~7?L&0M{dgBQT<@)EpBE5vhuSjFB!S+4|mp22wL- zV-&TjD5}&ZTDw;5QL8A`+LRCx;nS+By=zwO+FL1Ui`pq#qgHBfv4h~3@9&S?b8>TX z&%NiK=e*zV=k?s@4m=vc==9Q{EcUfX26H~9ZASlM>^=}__ww&W5dou~Xb*Agyl-p2=UI_xW^rLra4@U3{5v%OpTvm*J}8+^GvCu^aRmMZ=!vB<=f z>V97Vnu#s$u?vE^Xybv7W4Fm|_BN-@vLqO0;3KNB*T07d!I-lRvi%BVi~p;>WEE%f zYGH|%utQUH=lloqQU`UNDKO8=KZ?oUHZT98rJkQuRs0tD*n970 zg!`CO)DKL2e_EQN=<5u|W>(QNx1ak(MbCV7tM^Y?$%7O;MRQ-ArjI@?~uH?}K*}TJVx5+wrHtUhGfIo0ohy?%RTga zoJaRj;p4r$*=byii(8;x_&ut^ucphyxFdi0-AK%14 z&sJu@!HyPFwX;Gv+lH3s2>`{7zl0a749ywu+^zk8zZrVbms9!SVMJG{&S$VH z%%Ij--X>+iJ@X8%(i6Jr9!;Ic|M^-@vgv~G0W~a$Q?;xa$v$&bfR3{-gSDwkUQ&IX zY;>k-4ta5w4iBkJFaN%O4-y$UYPLGQVGyyW84+%gm(N`5xNuATU@P#A?IRM4FFZYy zO7723-smDA)q<|#4SvPkW+9CeK@DNOxKhbuLqQe?k1sX`ITN2_e@He)t0r0AXEOmX zK2$qnsee=cD?kHeX1mjD=58!6M*~AK|Bgwe=WC~7^7Ku8QefmX68S(V+)Q$NdQwbE zdcklD5o7gpf$#=!KO~_0JJXZ4w=1`bhim0uaX*be?Cr1rTduD*Ueo2IDf5>zNF!~B z|IZ{dB#1BdTttE`X8i{4;O1ue<90|bd0QLwhsjPc;o05$ zJk>W#jhqZQ*~Dti?eAwuFbVQisxo%3J#eD%WV-njqvloHrB)cw`D90AqpXU(Xp+Gq zB;d<}u81A0b>2|kX>vt;dRZx+l4u2xdY>Sw z>={k%D&=Pu)W5X16Z?q&{^g6oCn@stqJQ2#Wc%^*M^ch_W>D#8Clf}o{u%nhiD=O; zn4PLX7c$C<6xJLjT4|1bwWnPk`#h({a+T}O^2}C5W5AM-X4^v%B9hvnW)=FB@a;v( zM9Et2Yd&44B}HN5m@MnBEBD5K$@nvV%~SO$O9q|AQ!m7pX9Ro}-p>cdv5R=!V=A^^ z@O>j2uFvQFx&Qi$#cLy6sSF=l?K~y~AKf~8lVQ0wY|i#U`#f!uBlthcpnGnQUepTo z|6*;|%F1k-`@^pCr@7qAQy_0I_UlW!<~QvRY#w+Wo;^WvO9Tmscrhs3_BB6E{aJnZ z@}48h#Lw5&GW1W~8n`Q=vAd5<_gYX7)(`H_=@@A1ed_Z){ryh!N!W`JPlJsWJrwe* za7|Xol0?!5OHxb#pSr0$^Yhtn3MTK`cN>Km_gi(!iG}GKfOu^}(ubxq+wG_g=06{% zKeUq`G9g7bSbr~H*UaZ=dOO9mFS0XfXrqD{-)815<9f{3fzJsjyC(i@f$NKQ)bKq2 z-q6N9h6Ur028LCObiEXdx53O6i~Odfub_YV1(Wxr$09Q`{}rr1x~pQ9NEJV1k(isA zX8rMI;rBN%V!DM?>%+2MGt4D!aPZowHk+wv-K~QYl1v%Dn0SV@l#sZU6x)@6Yd5P# zW$y}mlcVbwozb)^tv>yd_>$>+5xr^{Ic>el(&r(r#o~6T%*<#rY0q!(Uj9ZPhAB)2 z`7d!=LiLnP_h&7nL`*BGE(dyDyloiQ4YcE=Z$mJw55KJ|{rR#~xJ_3c-g2Am*#~1^ zag*23zRzVJyC$BwUN2^IHLz@1O3`^^;k3uCX&%F^wSKRDO(8inJYmRnU~p2zY1!qP zQL#zleO;nRx6FPCTgfMj7s;$IJ(CSJD@;VIj6U~PwqQO~E@<&bKN9#?>&_FB$#Yc9 z)IF-f+W7QA0ZqfPekv7PeJQ1Pd5gkVD^Jow!;K^K> zohlO%i&KGQ)v|_YnvWVA0_i%7;n{<9w`im^yFJ=zmJ6rXh6JCuYVs^6@PYh1+`mU@ zRXrXxD=0F*$%_!X=kIZd)~fB#S9tN!|DAd6ZK|=`&ttdBWn9u(ij6#;E2L)6{FgFs z*q+J9sae)St}Jqqbqi#VMKM3>Tp?xy8CoQuX0MVMTIY<+g!z+&GhrASQQxg zTCBJ{G)h!oQ+kS+Nt002Vd9=&r=<9(+oN1Rkm^EPvg~_(bkoG7$8C7J!E#^4yE`&@ z4@W#5k*UAdm^^=t`vGt@>r)G48gy%s-rZwbI}qjKWtQ6$R=4{}>D@e^$3^dOynf9vZ5F)l zBulGPNWkN&cW#sFOgt^12`G5pnMEKOKc&?P3_m1sKV{K54nNG!`4(13+x~j%lk}v~ zG3JnD{!~mS(8a6*PMh_h4pvCAG;o4X(T|qp{QQreZwfl5Yq<&iWB`mU^9>py}LH@|00vRKQA&{p8K0 z3%*$aVoQytppwSfW$@Ev9kS1t6#rc|af`Vu6#QK)af_uaG|06!?|!qLZT#XmQLN~Cqf?Wv`$@2 z;p$-7mhibwh`oI3g$u7PZu-9=!71IOuXFz21CzFdL`YHJ-z06_SPu%i<>t>m#mkIN zaj7>Dnu3MJjj}YQx>)MY!-YKV^mQct-HoVe6jU03t;uZ{lP^cS^I;H_dRnipjUjH585d`+$4T@qyTPAh zJs*@wn)2p)J7+z9!Bt0FwBNz!p>f`IkoDan#iifusn`dhu(r3keXc2pJjBdX=V{}O zw%=~+!Cz~HieztHB6TKHm~kosVU}-4kul$8Q+~U;Xa_gPdW!7U)~X1NyzvmVoSv-O z2XakYc-7aU{4 zYT2e)Qd#V_T;H1%4|%kkvyx$f_>^DVCNRo@b2@^@z!~`~zNpq< z&24m2;xNYDgDXTdc3ZtOw@0?X3|+^9Qi%1`?9A#pF6h*E&Kg0J`!jy0-Sp|VgbVyE zN~VcVDDy#Jp@u`9P?6q1U#^T;j^`t99k;eo>vfMOAukoD(*$r-mEu<#-xI zOSpJ{QOxl)>o>Hd-fm+r zpvmCEOmVs-Of|>T%&53NXJb8}$y}&|ANj|-xPEA(d34I_h<9u%@aRuKlLJa1$I}X( zI~-Wig?1S@b5)$Kzm(1Kv_a<$2Uh-u_cr}W`*vK}HQ}=Oh@>7^)n(+e8RAbh-S$^{ zawT?7=p8bwbrkd!Q(&=4lhCJM;riWA$zoFpTq+5T#G!PFMv;%O}o4NI4i+NlD zIG$O5d4bDQ^VtLGu0<1x{{IH^L_%T0=Qd+9^NxqJKEGk-5nh`v^Ys4AV==FX z|m zw4IJf_Q+G=o7q&A_PLWxvHn+V1G9 z(BsJ&Tz#{qZ^KCd-Q||QHVANiw#S|U9V|Rh$M#`+?ySTb;#o(HF%t>)^w~7Z&_OB& zmp!XY%;{8sBAg=ofwSb@s9}0wb&*skP2Lklx^|vP>DNa@e=L^=X%|qohnm1%!-(Lt z(om$RVV9?~eY9HrYgaFva*Q}*L0`kV29kj6l=w$z2;=R{s@zG_CBntE3<~nGuQvGb zFJ-*H6VDV!xDkCl2Vdk$bH`3+EWm{M@L6n_C@(=+mM0zkU>$&VUz~sSvBMS=%F+TQ ziituA6B-V9#zq!`;^7|*M|-ifppTj3b&4^4M|vL%&a0JvgTkz_-8w)N#y?yD`y@P= zeb>7PF;TZw3ZA3#pqgU{0Pf}!v90c;tXs6BL^=KIK%DJQ(xc924@3Wd^Wl}sf!pFy zd)O#lq0*a3wJ)^!2O;*_3Y3NOK?-0qN&SK41EjT@VyQ#&KtMHkNAOhBpC;)umfmGfcqsnK1Bx{aGx_StB3R2fmC1UtJ#EzUZOu!*B)L@xh47eIj_@q)x2SWAybk zCid1u^h6*$M_Aw#LSpUXs=f3fX^ZFJ+7h#}Obil3jyfC`-m5N5tX1I}PMe^A0Q(m@7m6!?4Fkt?{;`ck3v-s>R z;z=-V_-^6u8Xae>HZ~|(`P01PV`32Onm=aOoOlA8GujT6zEUOm;vr>Uy<9`GJ2KZF zbPf@8`*&T7wR=2@wf}fr(*JYCR857>?f>#9#;s53!_J1N3I-C?&QMgGVh49uI&>B- zdE%QplzH6NhrK!7);qj8p%P1b2(>eYSV+LGTr9Z%Mh^%R;Fa9-TH4=gcueKD;Hu=% zQ-!=B+7*<{&fIsuiy84dI7uMytyZeg|IW@U-z#9X%N)Qtza=r^g4N-|I+sAWf!{ZV zj++W#(v2esW(bQ*R&G4V2)jW94ONCqnxH|s{K27I&OM%?str`c`$!8i<~Fw#)i(5bwp(HXm?4P#{bT%8?f$KP$X0ro_vQ+j*S(eQ?m*gHkN5Ow~0H zim<#M0eojdJLP4B8MnW$qdG9)e0m3FM5COF+xNY+O^Xrox0aB-Hlvun>~vzA z7Fj}>n>pZ*t5X{3Fq6c4uV3US%c-D+^PF+t3U@noIzVI3hmbs*kN$VtlAqH9Gc^57 z9MiGt2MGE?2mCYqeKjT4&UI|v=^Y14kQ-Rwz`7%s1req?FjYZ$$L;0yn(S>Gtl#k= zD6L+d)@pb~@;`yowuI$MT7+=7L+{JGU$Ljyj@Nh4QQ?%>_nM_#%V1loL8>$p6lS2z z9?K@oQL{l%OiA4cui509qPfVjrC`SQ#t>#(%ZcWJp0< zu3L3vtp4S}UtoV=ZSZB??H0eGGiuAPZue__;0A1#a)(0!C*Vzta5#No8%U1jg1cfY z4#0csO!BEMwMXGTi1#D;Q?w7tD$Q0Cj!nj1FYxEXJ$ixhI%AmB+J=O_U!yr3K~Q^? zoUuKC=7#{u_U4$dK}iQR0{y`1X;!>+bF^=c=>P|g+Heqj^Nk!CiPuF-uHw@l=IesUInL*MRwC!?^vcl z)>V9HVKvOwPX??cqXFyM?Qto!VWXx!XMNWAKu$=% zm63I8#8HYp-Z^E*?%hMUpU;O_*RRj6W-H_v=7!Gnb{>s8SX3=tWd9Jej&E&G zI?AX+VkONwk^iasLpP;`PDK0dM`1hW&G9LECw2CZ5xkpV$c{5Ae^+(fpQhg$H{~#V zhF$j?57G+vE;+QQwZ~g`hdekDwddWXRMidv5`M^3f!f?{slxs{jHGFRr?L=@`OM4v*L`u#mvEc0LZ(XOX>s;o_d0rJx7ro}) zXCog)bG7rz7J>tw-p6H0njer54Ifr(`(NaCu2im^Zub9CMtj;09ZY~f2VaJe+Zah! zube)=_*;$!g7o5EtNTdDr9MNVzV8 zeZ+YpN8r)x(|XTB&Z^Qru>cx3RUw;AI)GR3>r;XG&%O*TsfU@d73uUIOO4Ebmn@E? z9a)N={0y}Z zHxIsXUDXj%bO5MMgo1;T!|I|Ze2#%931Ofa?IVEdgXKzXc(D)OG)02o`I`X?F8ulD z;49x0qaQ>U=gx>ELq$?9MJTKhPMDR!!4Pyro>4JORGBS(=&laKe@o}3+!)^cP~Ih# zgbOTmL>VbvEjOOO=K?Cn0hpCgNH>kV3WIqv699}?`NnWN3qS;$S2k~p?_g- z_NRN!s!&{;ZS>Pt^C~s5N3*o#3O67ueT~4l+4>Ax8#Ya1+-%kkztTVd1g*8#i|o-H z?Zm+I{Zt1-JpcWum`DShzmP2ChA&-dWgRC5>xESP&pqUmwk%idURiG}g>*x<5rVe||l| z9b(htZK1|D=)EO6QEXCgYF>Z!*eaR{@=9wYr+!aJo3jh&h^H zlo&^Aho2M_R>K9@Jd^1q2wYC|CU4fp`g@ zA*}MaDMH>3+s`G7Lw52HzgEoiQ0)kH5bEqheh(lUXF)iGHJqDJ7xv+ReX}Syo*HH5 zxb0k#F00(rq@m60d~rxYa2LIDuE=A6_k_69rxXVnw_^re)4rby zezfUb2G>Buqj(AM==ktX;jm}|50WkA?^SWIFu_Pe5})U;I{ghv7q!MChu3waBBWqr zu(}PF^n(=k*E7J&hWHi=AQ^sHHeXg=hR_I1ls&GXM@SkpWjiKGzV!cftMV z%K6;#yctkizzmJ;wJp%~$0$t9I?|DE8TzdAT8p3LG-pe=kQv-jWcwQ+-SjMj&g^k3 zuN&8Y9*%4^6jlaJ;P`s+hjKpjQ~b)q=l?}w&qXd(f4%L8%%~v`v9YYYRuE;XP=Gw$ zjK-pf|h)n%3Vo+B+*4afVyl?8~TM06|ZwI%Rj3dH5RT+SAdSyBi-4VnQ zI%Nau)LBL;O-HbT90WTcVbLC@;SR;S;gZG|;SL}DfSp?N;7-G3BxH%%N0mV5Gp{uH zW=W7RZKkS!9mm8SJ}-0z`d>R7OCF#TqRc>YBNGxzG7s4`4aUHtdE4^km~z6ajp3A+ zZ~wxQe@#Ts=ebU&7?Nio3V$<|mz*4%3E#<*cTM?1W?nj&gQ&FNrtcJ0HXDv6Gp?(c z4WSw!QM*8l&{;NvBk(+vBp7uWVc{%!%0HSUUhV!D3X%m&hp%EX8`7z>L4$CLR`sSk z*mbNkmIJ$py@40PH?r>9CCFj@@Ud7Cb7UbK(n%x!w6ALC$Rc zN4q7G+3L|=_<(!-bt|enNXhAq3W_;OWx95*N!oUp)xPTBNoh8g2CwQU)D5lz^8n|d z$}|;Z+BpHn0p%ETFkF3a|6R0O+Ja^%W}p=%yWv@V7HbzCU>U%SR?~Owe0ZXPR1MQ4 zWoXI&`&j8gOtmXWXk znOqUxwC)uzm-B(4AT#PmlsiI-pc5wUyk}X3*1Z3<^JhKBhlxrOZtjgif{jRb$!i>( z%ueBi9J0{n>)*Y7_&>FN_kUB5%s)|G4p=Av3dkd$K3pdhq)f8~R@H7Y#yv0uHiO#M zmGIip!&qlBvHeLdS4BFZ4-Ab}u|_7rn7m^0U&#F*KUT%!OpqWX21aoV>{JT?bf|3u zNc=vmME*aEKN1|ssBdbCpqamGln!^blK&J-1XrLjyA7Qc2Fl;CZqia#lH0A0Oaqinx6 zNW8tokqRa%?)}rAdh_oZfnHRO@Ushz&3k+r&*%9<8;`@h#yULyiUI$Y4EIj5C9)q% zlneVXvI8&Qkb?w*1mnZ69{8;+zT3YlC1I}$iMaZ04L(Br@A&XfX1LXFbrHlG4ChrK&bwbb>=ii0?(}my~~TZ zCJ#ffBZLVcAD$dafCL2t7zWfP3#~eqP+s35>Lzh_itA*w>Lx>ek(s?C^$4XE%^ec! z5GG}DbN}!#0>;|MAvb*WNLg_ z#z%!5n+hiI*TiiALjf)O(h2cq436MGSLBE+KS>|y5ssGBe((%c_Mgb$TdA~@I!9Eh zkB+Ehjn6?@WvXhzjo_Nsf7k01K9P+wupC+wyK!LM)U7~&$eg1(;3lILzO8n?dQ&^v z9($9_2Vy*e!rS_^Ad|Z5VLX1xM9P-*eTXV>3%CQxrRZQoP!n12mZW>4`!U`S3*h{N zd9unP**CQgUV@f{M<7HmGEl0JXXMjIyhQtj6WC2SrWGqdULeR~47>VP62n^%0)p#@ zQf?KWf#9IQEB-^J4G1>g7=_^#?zrHe_eWhrWS?;nlCkwzmft+WQdbnR0627pW~+#Z zm1N`vJLCrfI&`)P{CVVnkI-ncDr4J#VXK)h>|MA@CGZn(y~7=ZRRLkiYnS}fxny|1 z6?Vzo|1f|eEUF))#Fc%UDJ#bW?t}l87dt9@eS#LPxlW!tbE^0~$|&V;Er!hl?pyHpQSSeJiyG!0_Yw0A>P!3^!dLWb#p*$^g0n zwjClvDXJ*ubmoC>ph&EBfGahEWf`1pFb_PqeL2A=jN!@WUIWi*kwKii%mtC{;GnD> z+nT~aFcg*a;kmoWm5@wcj`qsSlHmK*Zd z+94T72EFR#ykrM~WKH%O&{lIED26G)m}A56oCWjnnpk@VAMqN77KTYWTcdfP9N;{h z3zHuH3frE3I%r8<1Dw1T%7_58a3H8!UiU*nugOz*6ow9q_6wMy9a(B<)~Ln-)1|p& z^8%3_0iZ)BZp^lsSAJgqh4`=BeaH^kJfA8?Qf=iQ19$k(Kv$i0!>TRi8}Ali_BZ+d zTcQ?mx%=I;%+f&Q@fYn9L_kKUy7Ieh(wX=!She>&yb;e&VB&#Z=5EtSJcR>!ozFX>Yp-1o zA7F>IWG{nwA?XoflkjiClSbH7k02j5d0(!5-c6R!Bs63q9EBfi-{~}_Y7%RSJE9mr z_=2ym5GE)zNw;8@fpT^5_SdUAO;93e04Q6diiJ&~n*<~yXtAAlRee~dnMg|KTrHW) zR98U5=b9ahufC!EZiElD!-)1Zwq$?BnZRx?F4bf zy+G{=oOeTF+BjCHdyzL_c>6itnV%tGxMMK(LYY??yB`@f8MjOEKv*F)ibE3d z-vwX`)P{8ick7U(7Mt#X;_G?CXWzq=za0bNz@P16bAN0IrZv>0_eX$SilB(R`b(@N zJB%n)-ANl9w+u3>zuHNgN_OKg3Sxm5_m^||g^~zWzZLX%|_W6UmGL)M4-Z0kl5VbhKLT2li{A4BjLcBC%*=L-1{) zwSrtny;bfyqp+;A6aTErYV_(p5ps7^V2SUN+ZH??j&}JPX(S!y!#&`g`3it@b|i&Y zjCg|bo*^T+tU9?%)oZSkSXyX8F}^llV6I8%Hy8)*!IDrD3z0cP{=ZcjpDn(Ie=O`Hwz$^y70ZD?Z)a$UT8-RR?le7?v!>Z`4#h`#XcGj+ zg%RNwY+H_3Kqc!P!5+?YD1zM5K3UKp}Ya{0{@Iu!BgC= zq+Lw653R}Ai%iB&;o07E-Fepjlb{S*!AwLJ;aSNh3#b61d;KEePf0(!7Oz<4lTRSt z3rE5%8WkYvJ^LeGZF(hLBC!ddtAww1Rp!&_R-K8v3#?VnLCVnkEoxlCb)iYT#!`|`FhT%(*O z29aZ>eW+;XG9h4hqt}LGoMWQLCr5dr=RIxLfQ)JlPqCV^euZh3`@eI#wP$C6H+hN| z)Y|ptsa*`HgBWfA?Rnm6M|)x$`IAA`0)Cn|U&5>CTw);;Ccd5!xtEK7<8~<*9(+-( zc_|CBuK#w?(Bc~Dsq4*j0{+5~&HUE#_COQgW(jM~$16gp^<=lE9d&~r?d4x|qTOsa zI@xDk@Qe10Gu~g4^+K;6CU~%z>yKB&c0DB{2}Q{$q{Mh;*}- zYH68Ty5(G>pW_wxnYv0vFS@x{i+4WdSJ2tvdRW8ypcaFeXaa*rm;1Q%{430$ztl-j zmE?IGw}Kit*sPY$nq}3$n+2 z%RODLwr~l*Pr;A2Rua3Vq?%;!`gb!FX?(FbsAjH>;xAcq&)IHtlGGgT{8`!iGPl5r ziDgW@yUT@(+0t$&z$x=EgS})x&frmw*FvaTbcGQwb8H35QhT9LuW{ppPIg1T;YFC> zFoy+Qx3x$2Yv?DISA@g0G^1#WU5$BnoFU7}Mps$+*mW%p|1*S89s0PX%IbYd zV(l|O0TyL9nsps<5$BNRZ~lr2$A6f)K2di_7_?U!%9QLHuq?X$qc7iT9|65Jmn&7p ziIfE!OR1`na<|7cWxAIH>4!efjxB2yXKd*i9(F4`aA&eRSNA2X(a&0YLGHva#Xi3| z>rf?n8X{DeWDqT{srK3RBzCl`SmOlB2rqf7+d9Gm?z-_v%J`*sm&4lnO_f)lzA&ke zI#qLVA38P-F7ZK@wYD5(eBL2+yt){)nuWV*&I8yNXWcnw;ifxYliNGA5z2P#u`*sJ_-nKZ2wyM;frAtn^AK_t%!}JyzRU%Ej)%37s?r-#+;<5xW=cglPI%Uj1 zJPS2gNaEn`d3kRJ__!xzF~0V`1znXg|AdQ9z$1wd0(_@06-P<};^IKcGwCxQH}6M_3m76Y{ObIfZlt0Cq@wXWm&^aH+)?2-A6$+wEa(1q99%~ha#K(5y+5E2pBTB z|589V{}=h!gvSL&poTBThr0Q~cA>%dY0a7O^|rapDCYbh-haO9FcS(4LH56OvC$s| z^ELCxhwu^*Iulfro|=gg&<$sh`CkuNHrqcERd+S6ION3DuaktMN^vb&DQnZu12tqk zyXN)Qb~m2z+tm)lek#!ZRS;k9@x#Gz%}h_3vrjhIg6>(?9kDlc^z=Ub%Z4{R?04^YcfEQ6HN_?a|cK_dI2q zXu%5`X$y_G-v!WIhR@}xiTKU-(uk6h7^m9^&dwJWT3&^kXaSpoa!YNmhW?lhEt#jr zbhB>_tN;E<p;BW-Q;L`UG}O=2T%-Q#~G1hd#OD>f>7U7jUj=c%HfR5*Smk=(RqUOqb1 zb^OfCa;#!s+bmE(y&m&`{0_LDkD`K?61@{n@+1GHq>1bf`V{mzPG#;tj4l2+s(LGO zS!|@_@cY~65xmt#ysnX*w$Z9~wror&w|te)PN+iZ=Oe8C!Nu$~&#RmaW$Bx5ncA9q z;>zAQ`~R}h96_`FO%PG7=;JaI-_w#oDU8V3HnOSHYfoF9zR~%iAobhFknVo=^$Ym| z^A{TjiM}$pm=`xjvNfe-;?@9Jd!dCJ4QqK3YmJ$tM@t;<|A);QrU}fb*T0xq(B`6D zd4}@_m!A{I8Z$!V-5&-%H{osb5cq4-Z*Qu;Qul4)<45)h>IAK5#Fq)t7+*GJQQ>azQgkSuFKseX=K1}q4OyTp87M< zE-8JNR(GjGd9?*}tDZbzbn8-}9kyTPy{Uk@{B55aF?qxA&{M{UyU$1+Z7>|?ucaJd zU|7_=6Jt9T{qdz@;>65uzx_NDMN!m}&H*qdSA1+>*=8xxj<-l-%v0X+G~(mZwLhK` zgK5oBKbSd}5wJj^I|EKi~DqCR$cHk-Gr`o;BXvl22w+(>W zPdt72g~R^ zc!v^Udd4m~C<$porKzEeZ`cQc>be&<%0x5ayGl~O)3eu**Sx#r^n6#u0}MLC%7x&5 z2EuQu*1H~G4a(D^*^9io@TVK4O~&OKt{!noK}x4IA6pJ@gdXNrSDk)tX|L^z4(s82 zsyQs5!PKlMv3o}(C!hH~GKXdAt3h3Td70Z%M}v-<^WTWC z8f~JBANJ(&#pGNUw`8l66Tfq2Bq4mO=PciK_nm{V_$1ZByHy~!oH-}L;;6TBbfwAMEt{ZSY#ekR!@vxh^7?02V$ zQEb@9h1M?Lqk8vIvPmzev~$w$DMj}$*tF-PLxXnf=#Dhb)U~|P&AcGKGRY>|3ifg# biOuH-1rt3(x<5%Q>WzinS3m;?g7g0Ya_n46 literal 14046 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 diff --git a/addons/sourcemod/plugins/optional/specrates.smx b/addons/sourcemod/plugins/optional/specrates.smx index 7dab49c5772eeb7a7e4d85e3ba7c9dd8ee0ba3da..e27797fed249bfdbb22ad341ef99f3061c63d1c0 100644 GIT binary patch delta 5857 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 delta 5767 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 diff --git a/addons/sourcemod/scripting/caster_assister.sp b/addons/sourcemod/scripting/caster_assister.sp index ee6d72df9..944700af2 100644 --- a/addons/sourcemod/scripting/caster_assister.sp +++ b/addons/sourcemod/scripting/caster_assister.sp @@ -3,11 +3,13 @@ #include #include + #undef REQUIRE_PLUGIN #include -#define MAX_SPEED 2 +#define REQUIRE_PLUGIN -bool readyUpIsAvailable; +#define MAX_SPEED 2 +bool g_cvCasterSystem; public Plugin myinfo = { @@ -35,14 +37,14 @@ public void OnPluginStart() public void OnAllPluginsLoaded() { - readyUpIsAvailable = LibraryExists("caster_system"); + g_cvCasterSystem = LibraryExists("caster_system"); } public void OnLibraryRemoved(const char[] name) { if (StrEqual(name, "caster_system")) { - readyUpIsAvailable = false; + g_cvCasterSystem = false; } } @@ -50,13 +52,13 @@ public void OnLibraryAdded(const char[] name) { if (StrEqual(name, "caster_system")) { - readyUpIsAvailable = true; + g_cvCasterSystem = true; } } public void OnClientPutInServer(int client) { - if (readyUpIsAvailable && IsClientCaster(client)) + if (g_cvCasterSystem && bCaster(kClient, kGet, client)) { FakeClientCommand(client, "sm_spechud"); } diff --git a/addons/sourcemod/scripting/caster_system.sp b/addons/sourcemod/scripting/caster_system.sp index 3ea195095..cf6b39ac1 100644 --- a/addons/sourcemod/scripting/caster_system.sp +++ b/addons/sourcemod/scripting/caster_system.sp @@ -1,510 +1,2210 @@ +#pragma semicolon 1 +#pragma newdecls required + #include #include #include #include +#include + +#define DEBUG_SQL 0 +#define DEBUG_VALUE 0 +#define DEBUG_API 0 + +#define PLUGIN_VERSION "2.0" +#define STEAMID2_LENGTH 32 + +enum eTypeID +{ + kClient = 0, + kAuth = 1, +} + +enum eTypeAction +{ + kGet = 0, + kSet = 1, + kRem = 2 +} + +enum eTypeList +{ + kCaster = 0, + kWhite = 1, + kSQL = 2 +} + +StringMap + g_smCaster, + g_smWhitelist, + g_smSpecInmunity; + +ConVar + g_cvAddonsEnable, + g_cvKickSpecInmunity, + g_cvSefRegEnable, + g_cvSQLEnable, + g_cvSQLServerID, + g_cvWhitelistEnable; + +bool + g_bSQLConnected, + g_bSQLTableExists; + +enum eSQLDriver +{ + kMySQL = 0, + kSQLite = 1, +} + +Database + g_hDatabase; + +eSQLDriver + g_iSQLDriver; + +int + g_iDummy; + +char + g_szTable[] = "caster_whitelist"; + +GlobalForward + g_gfOnCaster, + g_gfOffCaster; + +public Plugin g_myInfo = { + name = "L4D2 Caster System", + author = "CanadaRox, Forgetest, lechuga", + description = "Standalone caster handler.", + version = PLUGIN_VERSION, + url = "https://github.com/SirPlease/L4D2-Competitive-Rework" +}; + +public APLRes AskPluginLoad2(Handle hMyself, bool bLate, char[] szError, int iErrMax) +{ + g_gfOnCaster = CreateGlobalForward("OnCaster", ET_Ignore, Param_Cell, Param_Cell, Param_String); + g_gfOffCaster = CreateGlobalForward("OffCaster", ET_Ignore, Param_Cell, Param_Cell, Param_String); + + CreateNative("bCaster", iCasterNative); + CreateNative("bCasterWhitelist", iWhitelistNative); + CreateNative("bKickSpecInmunity", iInmunityNative); + + RegPluginLibrary("caster_system"); + return APLRes_Success; +} + +public void OnPluginStart() +{ + vLoadTranslation("common.phrases"); + vLoadTranslation("caster_system.phrases"); + + g_smCaster = new StringMap(); + g_smWhitelist = new StringMap(); + g_smSpecInmunity = new StringMap(); + + CreateConVar("caster_version", PLUGIN_VERSION, "Caster System Version", FCVAR_NOTIFY | FCVAR_DONTRECORD); + g_cvWhitelistEnable = CreateConVar("caster_whitelist", "1", "Enable Whitelist, if deactivated, everyone will be able to register as a caster", FCVAR_NOTIFY, true, 0.0, true, 1.0); + g_cvSefRegEnable = CreateConVar("caster_selfreg", "1", "Enables self-registration, it is limited to the user being registered on the whitelist.", FCVAR_NOTIFY, true, 0.0, true, 1.0); + g_cvKickSpecInmunity = CreateConVar("caster_kickspecs_inmunity", "1", "Enable Kick Spec Inmunity", FCVAR_NOTIFY, true, 0.0, true, 1.0); + g_cvAddonsEnable = CreateConVar("caster_addons", "1", "Enable caster addons", FCVAR_NOTIFY, true, 0.0, true, 1.0); + g_cvSQLEnable = CreateConVar("caster_sql", "0", "Enable Whitelist SQL", FCVAR_NOTIFY, true, 0.0, true, 1.0); + g_cvSQLServerID = CreateConVar("caster_sql_serverid", "0", "Server ID, if it is set to 0 it will be disabled", FCVAR_NOTIFY, true, 0.0); + + g_cvSQLEnable.AddChangeHook(vOnSQLSettingChanged); + g_cvAddonsEnable.AddChangeHook(vOnAddonsSettingChanged); + + RegAdminCmd("sm_caster", aCasterRegCmd, ADMFLAG_BAN, "Registers a player to the caster list"); + RegAdminCmd("sm_caster_ls", aCasterListCmd, ADMFLAG_BAN, "Prints the list of casters"); + RegAdminCmd("sm_caster_rm", aCasterRemoveCmd, ADMFLAG_BAN, "Removes a player from the caster list"); + RegAdminCmd("sm_caster_rs", aCasterResetCmd, ADMFLAG_BAN, "Clears the entire caster list"); + + RegAdminCmd("sm_caster_wl", aWhitelistRegCmd, ADMFLAG_BAN, "Adds a player to the whitelist"); + RegAdminCmd("sm_caster_wl_ls", aWhitelistListCmd, ADMFLAG_BAN, "Prints the whitelist"); + RegAdminCmd("sm_caster_wl_rm", aWhitelistRemoveCmd, ADMFLAG_BAN, "Removes a player from the whitelist"); + RegAdminCmd("sm_caster_wl_rs", aWhitelistResetCmd, ADMFLAG_BAN, "Clears the entire whitelist"); + + RegAdminCmd("sm_caster_sql", aSQLRegCmd, ADMFLAG_BAN, "Adds a player to the database whitelist"); + RegAdminCmd("sm_caster_sql_ls", aSQLListCmd, ADMFLAG_BAN, "Downloads and prints the database whitelist"); + RegAdminCmd("sm_caster_sql_rm", aSQLRemoveCmd, ADMFLAG_BAN, "Removes a player from the database whitelist"); + RegAdminCmd("sm_caster_sql_rs", aSQLResetCmd, ADMFLAG_BAN, "Clears the entire database whitelist"); + RegAdminCmd("sm_caster_sql_cache", aSQLCacheCmd, ADMFLAG_BAN, "Downloads the database whitelist"); + + RegConsoleCmd("sm_cast", aSelfRegCastCmd, "Registers the calling player as a caster"); + RegConsoleCmd("sm_uncast", aSelfRemoveCastCmd, "Deregister yourself as a caster or allow admins to deregister other players"); + RegConsoleCmd("sm_kickspecs", aKickSpecsCmd, "Let's vote to kick those Spectators!"); + + HookEvent("player_team", vPlayerTeamEvent); + + AutoExecConfig(true, "caster_system"); +} + +// ======================== +// Natives +// ======================== + +/** + * @brief Add, checks or remove a user from the Casters list. + * + * @param eTypeID Defines how the client will be identified. + * @param eTypeAction What action will be taken. + * @param iClient Required only if eTypeID is kClient, otherwise set it to -1. + * @param szAuthId Required only if eTypeID is kAuth, otherwise it is not necessary to define it. + * @return True if the client or AuthID is a caster (for Get action), false otherwise. + */ +int iCasterNative(Handle hPlugin, int iNumParams) +{ + eTypeID eID = GetNativeCell(1); + eTypeAction eAction = GetNativeCell(2); + int iTarget = GetNativeCell(3); + char szAuthId[STEAMID2_LENGTH]; + GetNativeString(4, szAuthId, sizeof(szAuthId)); + +#if DEBUG_API + LogMessage("[iCasterNative] eTypeID: %d | eTypeAction: %d | iClient: %d | szAuthId: %s", eID, eAction, iTarget, szAuthId); +#endif + + switch (eAction) + { + case kGet: + return g_smCaster.GetValue(szAuthId, g_iDummy); + case kSet: + { + switch (eID) + { + case kClient: + { + char szName[32]; + GetClientName(iTarget, szName, sizeof(szName)); + vRegister(SERVER_INDEX, iTarget, szAuthId, szName, kCaster, eID, SM_REPLY_TO_CONSOLE); + } + case kAuth: + vRegister(SERVER_INDEX, NO_INDEX, szAuthId, szAuthId, kCaster, eID, SM_REPLY_TO_CONSOLE); + } + } + case kRem: + { + switch (eID) + { + case kClient: + { + char szName[32]; + GetClientName(iTarget, szName, sizeof(szName)); + vRemove(SERVER_INDEX, iTarget, szAuthId, szName, kCaster, eID, SM_REPLY_TO_CONSOLE); + } + case kAuth: + vRemove(SERVER_INDEX, NO_INDEX, szAuthId, szAuthId, kCaster, eID, SM_REPLY_TO_CONSOLE); + } + } + } + return 1; +} + +/** + * @brief Add, checks or remove a user from the Casters whitelist. + * + * @param eTypeID Defines how the client will be identified. + * @param eTypeAction What action will be taken. + * @param iClient Required only if eTypeID is kClient, otherwise set it to -1. + * @param szAuthId Required only if eTypeID is kAuth, otherwise it is not necessary to define it. + * @return True if the action was successful, false otherwise. + */ +int iWhitelistNative(Handle hPlugin, int iNumParams) +{ + eTypeID eID = GetNativeCell(1); + eTypeAction eAction = GetNativeCell(2); + int iTarget = GetNativeCell(3); + char szAuthId[STEAMID2_LENGTH]; + GetNativeString(4, szAuthId, sizeof(szAuthId)); + +#if DEBUG_API + LogMessage("[iWhitelistNative] eTypeID: %d | eTypeAction: %d | iClient: %d | szAuthId: %s", eID, eAction, iTarget, szAuthId); +#endif + + switch (eAction) + { + case kGet: + return g_smCaster.GetValue(szAuthId, g_iDummy); + case kSet: + { + switch (eID) + { + case kClient: + { + char szName[32]; + GetClientName(iTarget, szName, sizeof(szName)); + vRegister(SERVER_INDEX, iTarget, szAuthId, szName, kWhite, eID, SM_REPLY_TO_CONSOLE); + } + case kAuth: + vRegister(SERVER_INDEX, NO_INDEX, szAuthId, szAuthId, kWhite, eID, SM_REPLY_TO_CONSOLE); + } + } + case kRem: + { + switch (eID) + { + case kClient: + { + char szName[32]; + GetClientName(iTarget, szName, sizeof(szName)); + vRegister(SERVER_INDEX, iTarget, szAuthId, szName, kWhite, eID, SM_REPLY_TO_CONSOLE); + } + case kAuth: + vRemove(SERVER_INDEX, NO_INDEX, szAuthId, szAuthId, kWhite, eID, SM_REPLY_TO_CONSOLE); + } + } + } + return 1; +} + +/** + * @brief Add, checks or remove a user from the spectator immunity list. + * + * @param eTypeID Defines how the client will be identified. + * @param eTypeAction What action will be taken. + * @param iClient Required only if eTypeID is kClient, otherwise set it to -1. + * @param szAuthId Required only if eTypeID is kAuth, otherwise it is not necessary to define it. + * @return True if the client has spectator immunity, false otherwise. + */ +int iInmunityNative(Handle hPlugin, int iNumParams) +{ + if (!g_cvKickSpecInmunity.BoolValue) + return 0; + + eTypeID eID = GetNativeCell(1); + eTypeAction eAction = GetNativeCell(2); + int iTarget = GetNativeCell(3); + char szAuthId[STEAMID2_LENGTH]; + GetNativeString(4, szAuthId, sizeof(szAuthId)); + bool bInmunity; + +#if DEBUG_API + LogMessage("[iInmunityNative] eTypeID: %d | eTypeAction: %d | iClient: %d | szAuthId: %s", eID, eAction, iTarget, szAuthId); +#endif + + switch (eID) + { + case kClient: + bInmunity = bSpecInmunity(kClient, iTarget); + case kAuth: + bInmunity = bSpecInmunity(kAuth, NO_INDEX, szAuthId); + } + + switch (eAction) + { + case kGet: + return bInmunity; + case kSet: + { + if (bInmunity) + return 0; + + switch (eID) + { + case kClient: + { + char szClientAuthId[STEAMID2_LENGTH]; + GetClientAuthId(iTarget, AuthId_Steam2, szClientAuthId, sizeof(szClientAuthId)); + return g_smSpecInmunity.SetValue(szClientAuthId, true); + } + case kAuth: + return g_smSpecInmunity.SetValue(szAuthId, true); + } + } + case kRem: + { + if (bInmunity) + return 0; + + switch (eID) + { + case kClient: + { + char szClientAuthId[STEAMID2_LENGTH]; + GetClientAuthId(iTarget, AuthId_Steam2, szClientAuthId, sizeof(szClientAuthId)); + return g_smSpecInmunity.Remove(szClientAuthId); + } + case kAuth: + return g_smSpecInmunity.Remove(szAuthId); + } + } + } + return 1; +} + +// ======================== +// Caster Addons +// ======================== + +void vOnSQLSettingChanged(ConVar cvar, const char[] szOldValue, const char[] szNewValue) +{ + if (g_cvSQLEnable.BoolValue) + { + if (g_hDatabase != null) + delete g_hDatabase; + + OnConfigsExecuted(); + } + else + { + if (g_hDatabase == null) + return; + + delete g_hDatabase; + } +} + +void vOnAddonsSettingChanged(ConVar cvar, const char[] szOldValue, const char[] szNewValue) +{ + bool bDisable = (StringToInt(szNewValue) != 0); + bool bPrevious = (StringToInt(szOldValue) != 0); + + if (bDisable == bPrevious) + return; + + ArrayList hCastersList = (bDisable) ? new ArrayList() : null; + + for (int i = 1; i <= MaxClients; i++) + { + if (!IsClientInGame(i)) + continue; + + if (!bCaster(kClient, i)) + continue; + + if (bDisable) + { + CPrintToChat(i, "%t %t", "Prefix", "ForbidAddons"); + CPrintToChat(i, "%t %t", "Prefix", "Reconnect"); + hCastersList.Push(GetClientUserId(i)); + } + else + { + CPrintToChat(i, "%t %t", "Prefix", "AllowAddons"); + CPrintToChat(i, "%t %t", "Prefix", "CasterReconnect"); + } + } + + if (bDisable) + { + if (hCastersList.Length > 0) + CreateTimer(3.0, aReconnectCastersTimer, hCastersList, TIMER_FLAG_NO_MAPCHANGE | TIMER_DATA_HNDL_CLOSE); + else + delete hCastersList; + } +} + +Action aReconnectCastersTimer(Handle hTimer, ArrayList aCasterList) +{ + int iSize = aCasterList.Length; + for (int i = 0; i < iSize; i++) + { + int iClient = GetClientOfUserId(aCasterList.Get(i)); + if (iClient > SERVER_INDEX) + ReconnectClient(iClient); + } + + return Plugin_Stop; +} + +public Action L4D2_OnClientDisableAddons(const char[] szAuthId) +{ + return (!g_cvAddonsEnable.BoolValue && bCaster(kAuth, SERVER_INDEX, szAuthId)) ? Plugin_Handled : Plugin_Continue; +} + +void vPlayerTeamEvent(Event event, const char[] szName, bool bDontBroadcast) +{ + if (view_as(event.GetInt("team")) == L4DTeam_Spectator) + return; + + int iUserId = event.GetInt("userid"); + CreateTimer(1.0, aCasterCheck, iUserId, TIMER_FLAG_NO_MAPCHANGE); +} + +Action aCasterCheck(Handle hTimer, int iUserId) +{ + int iClient = GetClientOfUserId(iUserId); + if (!iClient || !IsClientInGame(iClient)) + return Plugin_Stop; + + if (!bCaster(kClient, iClient)) + return Plugin_Stop; + + if (L4D_GetClientTeam(iClient) == L4DTeam_Spectator) + return Plugin_Stop; + + CPrintToChat(iClient, "%t %t", "Prefix", "CasterPlay"); + CPrintToChat(iClient, "%t %t", "Prefix", "UseNoCast"); + ChangeClientTeam(iClient, view_as(L4DTeam_Spectator)); + + return Plugin_Stop; +} + +// ======================== +// Caster +// ======================== + +Action aCasterRegCmd(int iClient, int iArgs) +{ + ReplySource eRsCmd = GetCmdReplySource(); + if (iArgs == 0) + { + if (eRsCmd == SM_REPLY_TO_CHAT && iClient != SERVER_INDEX) + vDisplayRegMenu(iClient, kCaster); + else + CReplyToCommand(iClient, "%t %t: sm_caster <#userid|name|steamid>", "Prefix", "Use"); + return Plugin_Handled; + } + + char szArguments[64]; + GetCmdArgString(szArguments, sizeof(szArguments)); + + char szArg[STEAMID2_LENGTH]; + BreakString(szArguments, szArg, sizeof(szArg)); + + vProcessReg(iClient, szArg, kCaster, eRsCmd); + + return Plugin_Handled; +} + +void vProcessReg(int iClient, const char[] szArg, eTypeList eList, ReplySource eRsCmd) +{ + if (bIsSteamId(szArg)) + { + vRegister(iClient, NO_INDEX, szArg, szArg, eList, kAuth, eRsCmd); + return; + } + + int iTarget = FindTarget(iClient, szArg, true, false); + if (iTarget == NO_INDEX) + return; + + char szAuthId[STEAMID2_LENGTH]; + if (!GetClientAuthId(iTarget, AuthId_Steam2, szAuthId, sizeof(szAuthId))) + { + CReplyToCommand(iClient, "%t %t", "Prefix", "AuthIdError", szAuthId); + return; + } + + char szName[16]; + GetClientName(iTarget, szName, sizeof(szName)); + vRegister(iClient, iTarget, szAuthId, szName, eList, kClient, eRsCmd); +} + +/** + * Registers a client as a caster or whitelist member. + * + * @param iClient The client index of the player issuing the command. + * @param iTarget The client index of the target player. + * @param szAuthId The authentication ID of the target player. + * @param szDisplayName The display name of the target player. + * @param eList The type of list to register the player. + * @param eID The type of identification to use for the target player. + * @param eRsCmd The reply source for the command. + */ +void vRegister(int iClient, int iTarget, const char[] szAuthId, const char[] szDisplayName, eTypeList eList, eTypeID eID, ReplySource eRsCmd) +{ +#if DEBUG_VALUE + LogMessage("[vRegister] iClient: %d | iTarget: %d | szAuthId: %s | szDisplayName: %s | eTypeList: %d | eTypeID %d | eRsCmd: %d", iClient, iTarget, szAuthId, szDisplayName, eList, eID, eRsCmd); +#endif + + char + szRegMsg[128], + szRegFromMsg[128]; + + switch (eList) + { + case kCaster: + { + if (g_smCaster.GetValue(szAuthId, g_iDummy)) + { + CReplyToCommand(iClient, "%t %t", "Prefix", "CasterFound", szDisplayName); + return; + } + Format(szRegMsg, sizeof(szRegMsg), "%T", "CasterReg", iClient, szDisplayName); + if (eID == kClient) + Format(szRegFromMsg, sizeof(szRegFromMsg), "%T", "CasterRegFrom", iTarget, iClient); + } + case kWhite: + { + if (g_smWhitelist.GetValue(szAuthId, g_iDummy)) + { + CReplyToCommand(iClient, "%t %t", "Prefix", "WhitelistFound", szDisplayName); + return; + } + Format(szRegMsg, sizeof(szRegMsg), "%T", "WhitelistReg", iClient, szDisplayName); + if (eID == kClient) + Format(szRegFromMsg, sizeof(szRegFromMsg), "%T", "WhitelistRegFrom", iTarget, iClient); + } + case kSQL: + { + char szQuery[256]; + g_hDatabase.Format(szQuery, sizeof(szQuery), "SELECT authid FROM `%s` WHERE authid = '%s'", g_szTable, szAuthId); + +#if DEBUG_SQL + LogMessage("[vRegister] Query: %s", szQuery); +#endif + int + iUserId, + iTargetUserId; + + if (iClient != SERVER_INDEX) + iUserId = GetClientUserId(iClient); + + if (iTarget != NO_INDEX) + iTargetUserId = GetClientUserId(iTarget); + + DataPack pDataPack = new DataPack(); + pDataPack.WriteCell(iUserId); + pDataPack.WriteCell(iTargetUserId); + pDataPack.WriteString(szAuthId); + pDataPack.WriteCell(eID); + pDataPack.WriteCell(eRsCmd); + + SQL_TQuery(g_hDatabase, vSQLRegCallback, szQuery, pDataPack); + return; + } + } + + switch (eList) + { + case kCaster: + { + if (!g_smCaster.SetValue(szAuthId, true)) + { + CReplyToCommand(iClient, "%t %t", "Prefix", "CasterRegError", szAuthId); + return; + } + +#if DEBUG_API + LogMessage("[forward OnCaster] eTypeID: %d | iClient: %d | szAuthId: %s", eID, iTarget, szAuthId); +#endif + + Call_StartForward(g_gfOnCaster); + Call_PushCell(eID); + Call_PushCell(iTarget); + Call_PushString(szAuthId); + Call_Finish(); + } + case kWhite: + { + if (!g_smWhitelist.SetValue(szAuthId, true)) + { + CReplyToCommand(iClient, "%t %t", "Prefix", "WhitelistRegError", szAuthId); + return; + } + } + } + + CReplyToCommand(iClient, "%t %s", "Prefix", szRegMsg); + + if (eID == kAuth) + return; + + if ((L4D_GetClientTeam(iTarget) != L4DTeam_Spectator) && (eList == kCaster)) + ChangeClientTeam(iTarget, view_as(L4DTeam_Spectator)); + + CPrintToChat(iTarget, "%t %s", "Prefix", szRegFromMsg); + + if (eList == kCaster) + CPrintToChat(iTarget, "%t %t", "Prefix", "CasterReconnect"); +} + +void vDisplayRegMenu(int iClient, eTypeList eList) +{ + char szTitle[100]; + Format(szTitle, sizeof(szTitle), "%t", "MenuPlayersList"); + Menu hMenu = new Menu(iRegMenuHandler); + hMenu.SetTitle(szTitle); + vListTargets(hMenu, eList); + + hMenu.Display(iClient, MENU_TIME_FOREVER); +} + +/** + * Populates a menu with a list of targets based on the specified list type. + * + * @param hMenu The menu handle to which the targets will be added. + * @param eTypeList The type of list to determine the target selection criteria. + * + * The function iterates through all connected clients and adds them to the menu. + * It skips fake clients and clients that cannot be identified by name or Steam ID. + * Depending on the list type, it checks if the client is in the caster or whitelist. + * If the client is found in the respective list, the menu item is added as disabled. + * Otherwise, the menu item is added as enabled. + */ +void vListTargets(Menu hMenu, eTypeList eList) +{ + char + szName[64], + szInfo[16], + szAuthId[STEAMID2_LENGTH]; + + bool + bFound; + + for (int i = 1; i <= MaxClients; i++) + { + if (!IsClientConnected(i) || IsFakeClient(i)) + continue; + + if (!GetClientName(i, szName, sizeof(szName))) + continue; + + if (!GetClientAuthId(i, AuthId_Steam2, szAuthId, sizeof(szAuthId))) + continue; + + Format(szInfo, sizeof(szInfo), "%d:%d", GetClientUserId(i), view_as(eList)); + + switch (eList) + { + case kCaster: + bFound = g_smCaster.GetValue(szAuthId, g_iDummy); + case kWhite, kSQL: + bFound = g_smWhitelist.GetValue(szAuthId, g_iDummy); + } + + if (bFound) + hMenu.AddItem(szInfo, szName, ITEMDRAW_DISABLED); + else + hMenu.AddItem(szInfo, szName); + } +} + +public int iRegMenuHandler(Menu hMenu, MenuAction eAction, int iClient, int iItem) +{ + switch (eAction) + { + case MenuAction_Select: + { + char + szInfo[32], + szName[32]; + + int + iUserId, + iTarget; + + eTypeList eList; + + hMenu.GetItem(iItem, szInfo, sizeof(szInfo), _, szName, sizeof(szName)); + + char szParts[2][8]; + ExplodeString(szInfo, ":", szParts, 2, 4); + + iUserId = StringToInt(szParts[0]); + eList = view_as(StringToInt(szParts[1])); + + if ((iTarget = GetClientOfUserId(iUserId)) == SERVER_INDEX) + CPrintToChat(iClient, "%t %t", "Prefix", "Player no longer available"); + else + { + char szAuthId[STEAMID2_LENGTH]; + if (!GetClientAuthId(iTarget, AuthId_Steam2, szAuthId, sizeof(szAuthId))) + { + CReplyToCommand(iClient, "%t %t", "Prefix", "AuthIdError", szAuthId); + return Plugin_Handled; + } + + vRegister(iClient, iTarget, szAuthId, szName, eList, kClient, SM_REPLY_TO_CHAT); + } + } + case MenuAction_End: + delete hMenu; + } + return 0; +} + +Action aCasterListCmd(int iClient, int iArgs) +{ + return aListCmd(iClient, kCaster); +} + +Action aListCmd(int iClient, eTypeList type) +{ + PrintListPrinted(iClient); + + switch (type) + { + case kCaster: + { + StringMapSnapshot hSnapshot = g_smCaster.Snapshot(); + PrintSnapshotList(iClient, hSnapshot, "/***********[Casters]***********\\", ">* Total Casters: %i"); + } + case kWhite: + { + StringMapSnapshot hSnapshot = g_smWhitelist.Snapshot(); + PrintSnapshotList(iClient, hSnapshot, "/***********[Whitelist]***********\\", ">* Total Whitelist: %i"); + } + case kSQL: + { + if (!g_cvSQLEnable.BoolValue) + { + CReplyToCommand(iClient, "%t %t", "Prefix", "SQLDisabled"); + return Plugin_Handled; + } + if (!g_bSQLConnected) + { + CReplyToCommand(iClient, "%t %t", "Prefix", "SQLNoConnect"); + return Plugin_Handled; + } + + char szQuery[256]; + g_hDatabase.Format(szQuery, sizeof(szQuery), "SELECT authid, serverid FROM `%s`", g_szTable); + +#if DEBUG_SQL + LogMessage("[aListCmd] Query: %s", szQuery); +#endif + + DataPack pDataPack = new DataPack(); + pDataPack.WriteCell(iClient); + SQL_TQuery(g_hDatabase, vSQLListCallback, szQuery, pDataPack); + } + } + + return Plugin_Handled; +} + +void PrintSnapshotList(int iClient, StringMapSnapshot hSnapshot, const char[] sHeader, const char[] sTotalLabel) +{ + PrintToConsole(iClient, sHeader); + + char szAuthID[128]; + int + iLen = hSnapshot.Length, + iTarget; + for (int i = 0; i < iLen; i++) + { + hSnapshot.GetKey(i, szAuthID, sizeof(szAuthID)); + iTarget = GetClientOfAuthID(szAuthID); + + if (iTarget == NO_INDEX) + PrintToConsole(iClient, "AuthID: %s", szAuthID); + else + PrintToConsole(iClient, "AuthID: %s [%N]", szAuthID, iTarget); + } + PrintToConsole(iClient, sTotalLabel, iLen); + + delete hSnapshot; +} + +void PrintListPrinted(int iClient) +{ + if (GetCmdReplySource() == SM_REPLY_TO_CONSOLE || iClient == SERVER_INDEX) + return; + + CPrintToChat(iClient, "%t %t", "Prefix", "ListPrinted"); +} + +Action aCasterResetCmd(int iClient, int iArgs) +{ + g_smCaster.Clear(); + CReplyToCommand(iClient, "%t %t", "Prefix", "CasterReset"); + return Plugin_Handled; +} + +Action aCasterRemoveCmd(int iClient, int iArgs) +{ + ReplySource eRsCmd = GetCmdReplySource(); + if (iArgs == 0) + { + if (eRsCmd == SM_REPLY_TO_CHAT && iClient != SERVER_INDEX) + vDisplayRemoveMenu(iClient, kCaster); + else + CReplyToCommand(iClient, "%t %t: sm_caster_rm <#userid|name|steamid>", "Prefix", "Use"); + return Plugin_Handled; + } + + char szArguments[64]; + GetCmdArgString(szArguments, sizeof(szArguments)); + + char szArg[STEAMID2_LENGTH]; + BreakString(szArguments, szArg, sizeof(szArg)); + + vProcessRemove(iClient, szArg, kCaster, eRsCmd); + return Plugin_Handled; +} + +/** + * Processes the removal of a client from a specified list. + * + * @param iClient The client index initiating the removal. + * @param szArg The argument provided, which can be a Steam ID or a target name. + * @param eList The list type from which the client should be removed. + * @param eRsCmd The reply source for the command. + */ +void vProcessRemove(int iClient, const char[] szArg, eTypeList eList, ReplySource eRsCmd) +{ + if (bIsSteamId(szArg)) + { + vRemove(iClient, NO_INDEX, szArg, szArg, eList, kAuth, eRsCmd); + return; + } + + int iTarget = FindTarget(iClient, szArg, true, false); + if (iTarget == NO_INDEX) + return; + + char szAuthId[STEAMID2_LENGTH]; + if (!GetClientAuthId(iTarget, AuthId_Steam2, szAuthId, sizeof(szAuthId))) + { + CReplyToCommand(iClient, "%t %t", "Prefix", "AuthIdError", szAuthId); + return; + } + + char szName[16]; + GetClientName(iTarget, szName, sizeof(szName)); + vRemove(iClient, iTarget, szAuthId, szName, eList, kClient, eRsCmd); +} + +/** + * Removes a client from a specified list and sends appropriate messages. + * + * @param iClient The client index who initiated the removal. + * @param iTarget The target client index to be removed. + * @param szAuthId The authentication ID of the target client. + * @param szDisplayName The display name of the target client. + * @param eList The list type from which the client is to be removed. + * @param eID The type of identification to use for the target client. + * @param eRsCmd The reply source for the command. + */ +void vRemove(int iClient, int iTarget, const char[] szAuthId, const char[] szDisplayName, eTypeList eList, eTypeID eID, ReplySource eRsCmd) +{ +#if DEBUG_VALUE + LogMessage("[vRegister] iClient: %d | iTarget: %d | szAuthId: %s | szDisplayName: %s | eTypeList: %d | eTypeID %d | eRsCmd: %d", iClient, iTarget, szAuthId, szDisplayName, eList, eID, eRsCmd); +#endif + + char + szRemoveMsg[128], + szRemoveFromMsg[128]; + + switch (eList) + { + case kCaster: + { + if (!g_smCaster.GetValue(szAuthId, g_iDummy)) + { + CReplyToCommand(iClient, "%t %t", "Prefix", "CasterNoFound", szDisplayName); + return; + } + Format(szRemoveMsg, sizeof(szRemoveMsg), "%T", "CasterRemove", iClient, szDisplayName); + if (eID == kClient) + Format(szRemoveFromMsg, sizeof(szRemoveFromMsg), "%T", "CasterRemoveFrom", iTarget, iClient); + } + case kWhite: + { + if (!g_smWhitelist.GetValue(szAuthId, g_iDummy)) + { + CReplyToCommand(iClient, "%t %t", "Prefix", "WhitelistNoFound", szDisplayName); + return; + } + Format(szRemoveMsg, sizeof(szRemoveMsg), "%T", "WhitelistRemove", iClient, szDisplayName); + if (eID == kClient) + Format(szRemoveFromMsg, sizeof(szRemoveFromMsg), "%T", "WhitelistRemoveFrom", iTarget, iClient); + } + case kSQL: + { + char szQuery[256]; + g_hDatabase.Format(szQuery, sizeof(szQuery), "SELECT authid FROM `%s` WHERE authid = '%s'", g_szTable, szAuthId); + +#if DEBUG_SQL + LogMessage("[vRemove] Query: %s", szQuery); +#endif + int + iUserId, + iTargetUserId; + + if (iClient != SERVER_INDEX) + iUserId = GetClientUserId(iClient); + + if (iTarget != NO_INDEX) + iTargetUserId = GetClientUserId(iTarget); + + DataPack pDataPack = new DataPack(); + pDataPack.WriteCell(iUserId); + pDataPack.WriteCell(iTargetUserId); + pDataPack.WriteString(szAuthId); + pDataPack.WriteCell(eID); + pDataPack.WriteCell(eRsCmd); + + SQL_TQuery(g_hDatabase, vSQLRemoveCallback, szQuery, pDataPack); + return; + } + } + + switch (eList) + { + case kCaster: + { + if (!g_smCaster.Remove(szAuthId)) + { + CReplyToCommand(iClient, "%t %t", "Prefix", "CasterRemoveError", szAuthId); + return; + } + +#if DEBUG_API + LogMessage("[forward OffCaster] eTypeID: %d | iClient: %d | szAuthId: %s", eID, iTarget, szAuthId); +#endif + + Call_StartForward(g_gfOffCaster); + Call_PushCell(eID); + Call_PushCell(iTarget); + Call_PushString(szAuthId); + Call_Finish(); + + if (eID == kClient) + CreateTimer(3.0, aReconnectTimer, iTarget); + } + case kWhite: + { + if (!g_smWhitelist.Remove(szAuthId)) + { + CReplyToCommand(iClient, "%t %t", "Prefix", "WhitelistRemoveError", szAuthId); + return; + } + } + } + + CReplyToCommand(iClient, "%t %s", "Prefix", szRemoveMsg); + + if (eID == kAuth) + return; + + CPrintToChat(iTarget, "%t %s", "Prefix", szRemoveFromMsg); +} + +void vDisplayRemoveMenu(int iClient, eTypeList eList) +{ + char szTitle[100]; + switch (eList) + { + case kCaster: + Format(szTitle, sizeof(szTitle), "%T", "MenuCastersList", iClient); + case kWhite, kSQL: + Format(szTitle, sizeof(szTitle), "%T", "MenuWhitelistList", iClient); + } + + Menu hMenu = new Menu(iMenuRemoveHandler); + hMenu.SetTitle(szTitle); + vRemoveTargets(hMenu, eList, iClient); + + hMenu.Display(iClient, MENU_TIME_FOREVER); +} + +/** + * Removes targets from the specified menu based on the given type list. + * + * @param hMenu The menu handle to which the targets will be added. + * @param eList The type list to determine which targets to remove. + * @param iClient The client index who initiated the removal. + * + * This function iterates through all connected clients, checks if they match + * the criteria specified by the type list, and adds them to the menu if they do. + * If no targets are found, a message indicating no targets to remove is added + * to the menu. + */ +void vRemoveTargets(Menu hMenu, eTypeList eList, int iClient) +{ + char + szName[64], + szInfo[16], + szAuthId[STEAMID2_LENGTH]; + + bool + bFound; + + int + iTargets = 0; + + for (int i = 1; i <= MaxClients; i++) + { + if (!IsClientConnected(i) || IsFakeClient(i)) + continue; + + if (!GetClientName(i, szName, sizeof(szName))) + continue; + + if (!GetClientAuthId(i, AuthId_Steam2, szAuthId, sizeof(szAuthId))) + continue; + + Format(szInfo, sizeof(szInfo), "%d:%d", GetClientUserId(i), view_as(eList)); + + switch (eList) + { + case kCaster: + bFound = g_smCaster.GetValue(szAuthId, g_iDummy); + case kWhite, kSQL: + bFound = g_smWhitelist.GetValue(szAuthId, g_iDummy); + } + + if (bFound) + { + hMenu.AddItem(szInfo, szName); + iTargets++; + } + } + + if (iTargets == 0) + { + char szMsj[64]; + Format(szMsj, sizeof(szMsj), "%T", "NoTargetsToRemove", iClient); + hMenu.AddItem("", szMsj, ITEMDRAW_DISABLED); + } +} + +public int iMenuRemoveHandler(Menu hMenu, MenuAction eAction, int iClient, int iItem) +{ + if (eAction == MenuAction_Select) + { + char + szInfo[32], + szName[32]; + + int + iUserId, + iTarget; + + eTypeList eList; + + hMenu.GetItem(iItem, szInfo, sizeof(szInfo), _, szName, sizeof(szName)); + + char szParts[2][8]; + ExplodeString(szInfo, ":", szParts, 2, 4); + + iUserId = StringToInt(szParts[0]); + eList = view_as(StringToInt(szParts[1])); + + if ((iTarget = GetClientOfUserId(iUserId)) == SERVER_INDEX) + CPrintToChat(iClient, "%t %t", "Prefix", "Player no longer available"); + else + { + char szAuthId[STEAMID2_LENGTH]; + if (!GetClientAuthId(iTarget, AuthId_Steam2, szAuthId, sizeof(szAuthId))) + { + CReplyToCommand(iClient, "%t %t", "Prefix", "AuthIdError", szAuthId); + return Plugin_Handled; + } + + vRemove(iClient, iTarget, szAuthId, szName, eList, kClient, SM_REPLY_TO_CHAT); + } + } + else if (eAction == MenuAction_End) + delete hMenu; + return 0; +} + +// ======================== +// Whitelist +// ======================== + +Action aWhitelistRegCmd(int iClient, int iArgs) +{ + ReplySource eRsCmd = GetCmdReplySource(); + if (iArgs == 0) + { + if (eRsCmd == SM_REPLY_TO_CHAT && iClient != SERVER_INDEX) + vDisplayRegMenu(iClient, kWhite); + else + CReplyToCommand(iClient, "%t %t: sm_caster_wl <#userid|name|steamid>", "Prefix", "Use"); + return Plugin_Handled; + } + + char szArguments[64]; + GetCmdArgString(szArguments, sizeof(szArguments)); + + char szArg[STEAMID2_LENGTH]; + BreakString(szArguments, szArg, sizeof(szArg)); + + vProcessReg(iClient, szArg, kWhite, eRsCmd); + + return Plugin_Handled; +} + +Action aWhitelistListCmd(int iClient, int iArgs) +{ + return aListCmd(iClient, kWhite); +} + +Action aWhitelistResetCmd(int iClient, int iArgs) +{ + g_smWhitelist.Clear(); + CReplyToCommand(iClient, "%t %t", "Prefix", "WhitelistReset"); + return Plugin_Handled; +} + +Action aWhitelistRemoveCmd(int iClient, int iArgs) +{ + ReplySource eRsCmd = GetCmdReplySource(); + if (iArgs == 0) + { + if (eRsCmd == SM_REPLY_TO_CHAT && iClient != SERVER_INDEX) + vDisplayRemoveMenu(iClient, kWhite); + else + CReplyToCommand(iClient, "%t %t: sm_caster_wl_rm <#userid|name|steamid>", "Prefix", "Use"); + return Plugin_Handled; + } + + char szArguments[64]; + GetCmdArgString(szArguments, sizeof(szArguments)); + + char szArg[STEAMID2_LENGTH]; + BreakString(szArguments, szArg, sizeof(szArg)); + + vProcessRemove(iClient, szArg, kWhite, eRsCmd); + return Plugin_Handled; +} + +// ======================== +// SQL +// ======================== + +Action aSQLRegCmd(int iClient, int iArgs) +{ + if (!g_cvSQLEnable.BoolValue) + { + CReplyToCommand(iClient, "%t %t", "Prefix", "SQLDisabled"); + return Plugin_Handled; + } + + if (!g_bSQLConnected) + { + CReplyToCommand(iClient, "%t %t", "Prefix", "SQLNoConnect"); + return Plugin_Handled; + } + + ReplySource eRsCmd = GetCmdReplySource(); + if (iArgs == 0) + { + if (eRsCmd == SM_REPLY_TO_CHAT && iClient != SERVER_INDEX) + vDisplayRegMenu(iClient, kSQL); + else + CReplyToCommand(iClient, "%t %t: sm_caster_sql <#userid|name|steamid>", "Prefix", "Use"); + return Plugin_Handled; + } + + char szArguments[64]; + GetCmdArgString(szArguments, sizeof(szArguments)); + + char szArg[STEAMID2_LENGTH]; + BreakString(szArguments, szArg, sizeof(szArg)); + + vProcessReg(iClient, szArg, kSQL, eRsCmd); + + return Plugin_Handled; +} + +void vSQLRegCallback(Handle hDatabase, Handle hResult, const char[] szError, any data) +{ + DataPack pDataPack = view_as(data); + char szAuthId[STEAMID2_LENGTH]; + + int + iClient, + iTarget, + iUserId, + iTargetUserId; + + pDataPack.Reset(); + iUserId = pDataPack.ReadCell(), + iTargetUserId = pDataPack.ReadCell(); + pDataPack.ReadString(szAuthId, sizeof(szAuthId)); + eTypeID eID = pDataPack.ReadCell(); + ReplySource eRsCmd = pDataPack.ReadCell(); + delete pDataPack; + + if (iUserId != SERVER_INDEX) + iClient = GetClientOfUserId(iUserId); + + if (iTargetUserId != NO_INDEX) + iTarget = GetClientOfUserId(iTargetUserId); + + SetCmdReplySource(eRsCmd); + if (hResult == null) + { + LogError("[vSQLRegCallback] %s", "SQLError", LANG_SERVER, szError); + CReplyToCommand(iClient, "%t %t", "Prefix", "SQLError"); + return; + } + + if (SQL_FetchRow(hResult)) + { + CReplyToCommand(iClient, "%t %t", "Prefix", "SQLFound", szAuthId); + delete hResult; + return; + } + delete hResult; + + char szQuery[256]; + g_hDatabase.Format(szQuery, sizeof(szQuery), "INSERT INTO `%s` (authid, serverid) VALUES ('%s', %d)", g_szTable, szAuthId, g_cvSQLServerID.IntValue); + +#if DEBUG_SQL + LogMessage("[vSQLRegCallback] Query: %s", szQuery); +#endif + + if (!SQL_FastQuery(g_hDatabase, szQuery)) + { + LogError("[vSQLRegCallback] %s", "SQLError", LANG_SERVER, szError); + CReplyToCommand(iClient, "%t %t", "Prefix", "SQLError"); + return; + } + + switch (eID) + { + case kClient: + { + char szName[16]; + GetClientName(iTarget, szName, sizeof(szName)); + + if (!g_smWhitelist.SetValue(szAuthId, 1)) + CReplyToCommand(iClient, "%t %t", "Prefix", "WhitelistRegError", szName); + else + { + CReplyToCommand(iClient, "%t %t", "Prefix", "SQLReg", szName); + CReplyToCommand(iTarget, "%t %t", "Prefix", "SQLRegFrom", iClient); + } + } + case kAuth: + { + if (!g_smWhitelist.SetValue(szAuthId, 1)) + CReplyToCommand(iClient, "%t %t", "Prefix", "WhitelistRegError", szAuthId); + else + CReplyToCommand(iClient, "%t %t", "Prefix", "SQLReg", szAuthId); + } + } +} + +Action aSQLListCmd(int iClient, int iArgs) +{ + return aListCmd(iClient, kSQL); +} + +void vSQLListCallback(Handle hDatabase, Handle hResult, const char[] szError, any data) +{ + DataPack pDataPack = view_as(data); + pDataPack.Reset(); + int iClient = pDataPack.ReadCell(); + delete pDataPack; + + if (hResult == null) + { + char szErrorMsg[128]; + Format(szErrorMsg, sizeof(szErrorMsg), "%T: %s", "SQLError", LANG_SERVER, szError); + + CPrintToChat(iClient, "%t %t", "Prefix", "SQLError"); + CRemoveTags(szErrorMsg, sizeof(szErrorMsg)); + LogError("[vSQLListCallback] %s", szErrorMsg); + return; + } + + PrintToConsole(iClient, "/***********[Whitelist SQL]***********/"); + int iCount = 0; + + while (SQL_FetchRow(hResult)) + { + char szAuthId[STEAMID2_LENGTH]; + SQL_FetchString(hResult, 0, szAuthId, sizeof(szAuthId)); + int iServerId = SQL_FetchInt(hResult, 1); + PrintToConsole(iClient, "AuthID: %s | ServerID: %d", szAuthId, iServerId); + iCount++; + } + + PrintToConsole(iClient, ">* Total Casters: %d", iCount); + + delete hResult; +} + +Action aSQLRemoveCmd(int iClient, int iArgs) +{ + if (!g_cvSQLEnable.BoolValue) + { + CReplyToCommand(iClient, "%t %t", "Prefix", "SQLDisabled"); + return Plugin_Handled; + } + + if (!g_bSQLConnected) + { + CReplyToCommand(iClient, "%t %t", "Prefix", "SQLNoConnect"); + return Plugin_Handled; + } + + ReplySource eRsCmd = GetCmdReplySource(); + if (iArgs == 0) + { + if (eRsCmd == SM_REPLY_TO_CHAT && iClient != SERVER_INDEX) + vDisplayRemoveMenu(iClient, kSQL); + else + CReplyToCommand(iClient, "%t %t: sm_caster_sql_rm <#userid|name|steamid>", "Prefix", "Use"); + return Plugin_Handled; + } + + char szArguments[64]; + GetCmdArgString(szArguments, sizeof(szArguments)); + + char szArg[STEAMID2_LENGTH]; + BreakString(szArguments, szArg, sizeof(szArg)); + + vProcessRemove(iClient, szArg, kSQL, eRsCmd); + + return Plugin_Handled; +} + +public void vSQLRemoveCallback(Handle hDatabase, Handle hResult, const char[] szError, any data) +{ + DataPack pDataPack = view_as(data); + char szAuthId[STEAMID2_LENGTH]; + + int + iClient, + iTarget, + iUserId, + iTargetUserId; + + pDataPack.Reset(); + iUserId = pDataPack.ReadCell(), + iTargetUserId = pDataPack.ReadCell(); + pDataPack.ReadString(szAuthId, sizeof(szAuthId)); + eTypeID eID = pDataPack.ReadCell(); + ReplySource eRsCmd = pDataPack.ReadCell(); + delete pDataPack; + + if (iUserId != SERVER_INDEX) + iClient = GetClientOfUserId(iUserId); + + if (iTargetUserId != NO_INDEX) + iTarget = GetClientOfUserId(iTargetUserId); + + SetCmdReplySource(eRsCmd); + if (hResult == null) + { + LogError("[vSQLRemoveCallback] %s", "SQLError", LANG_SERVER, szError); + CReplyToCommand(iClient, "%t %t", "Prefix", "SQLError"); + return; + } + + if (!SQL_FetchRow(hResult)) + { + CReplyToCommand(iClient, "%t %t", "Prefix", "SQLNoFound", szAuthId); + delete hResult; + return; + } + + delete hResult; + + char szQuery[256]; + g_hDatabase.Format(szQuery, sizeof(szQuery), "DELETE FROM `%s` WHERE authid = '%s'", g_szTable, szAuthId); + +#if DEBUG_SQL + LogMessage("[vSQLRemoveCallback] Query: %s", szQuery); +#endif + + if (!SQL_FastQuery(g_hDatabase, szQuery)) + { + LogError("[vSQLRemoveCallback] %s", "SQLError", LANG_SERVER, szError); + CReplyToCommand(iClient, "%t %t", "Prefix", "SQLError"); + return; + } + + switch (eID) + { + case kClient: + { + char szName[16]; + GetClientName(iTarget, szName, sizeof(szName)); + + if (!g_smWhitelist.Remove(szAuthId)) + { + CReplyToCommand(iClient, "%t %t", "Prefix", "WhitelistRemoveError", szName); + return; + } + + CReplyToCommand(iClient, "%t %t", "Prefix", "SQLRemoved", szName); + CReplyToCommand(iTarget, "%t %t", "Prefix", "SQLRemovedFrom", iClient); + } + case kAuth: + { + if (!g_smWhitelist.Remove(szAuthId)) + { + CReplyToCommand(iClient, "%t %t", "Prefix", "WhitelistRemoveError", szAuthId); + return; + } + CReplyToCommand(iClient, "%t %t", "Prefix", "SQLRemoved", szAuthId); + } + } +} + +Action aSQLResetCmd(int iClient, int iArgs) +{ + if (!g_cvSQLEnable.BoolValue) + { + CReplyToCommand(iClient, "%t %t", "Prefix", "SQLDisabled"); + return Plugin_Handled; + } + + if (!g_bSQLConnected) + { + CReplyToCommand(iClient, "%t %t", "Prefix", "SQLNoConnect"); + return Plugin_Handled; + } + + char szQuery[64]; + g_hDatabase.Format(szQuery, sizeof(szQuery), "DELETE FROM `%s`", g_szTable); + +#if DEBUG_SQL + LogMessage("[aSQLResetCmd] Query: %s", szQuery); +#endif + + if (!SQL_FastQuery(g_hDatabase, szQuery)) + { + logErrorSQL(g_hDatabase, szQuery, "aSQLResetCmd"); + CReplyToCommand(iClient, "%t %t", "Prefix", "SQLQueryError"); + return Plugin_Handled; + } + + CReplyToCommand(iClient, "%t %t", "Prefix", "SQLResetSuccess"); + return Plugin_Handled; +} + +Action aSQLCacheCmd(int iClient, int iArgs) +{ + if (!g_cvSQLEnable.BoolValue) + { + CReplyToCommand(iClient, "%t %t", "Prefix", "SQLDisabled"); + return Plugin_Handled; + } + + if (!g_bSQLConnected) + { + CReplyToCommand(iClient, "%t %t", "Prefix", "SQLNoConnect"); + return Plugin_Handled; + } -#pragma semicolon 1 -#pragma newdecls required + DataPack pDataPack = new DataPack(); + pDataPack.WriteCell(GetClientUserId(iClient)); + + vQueryWhitelist(pDataPack); + CReplyToCommand(iClient, "%t %t", "Prefix", "SQLCacheSuccess"); + return Plugin_Handled; +} -#define PLUGIN_VERSION "1.0" +// ======================== +// Self +// ======================== -public Plugin myinfo = +Action aSelfRegCastCmd(int iClient, int iArgs) { - name = "L4D2 Caster System (Original built in readyup)", - author = "CanadaRox, Forgetest", - description = "Standalone caster handler.", - version = PLUGIN_VERSION, - url = "https://github.com/Target5150/MoYu_Server_Stupid_Plugins" -}; + bool bIsAdmin = (GetUserAdmin(iClient) != INVALID_ADMIN_ID); + if (iArgs != 0) + { + if (!bIsAdmin) + { + CReplyToCommand(iClient, "%t %t", "Prefix", "SelfRegNoAdmin"); + return Plugin_Handled; + } -#define L4D2Team_Spectator 1 + char szArguments[256]; + GetCmdArgString(szArguments, sizeof(szArguments)); + FakeClientCommandEx(iClient, "sm_caster %s", szArguments); + return Plugin_Handled; + } -#define TRANSLATION_COMMON "common.phrases" -#define TRANSLATION_CASTER "caster_system.phrases" + if (iClient == SERVER_INDEX) + { + CReplyToCommand(iClient, "%t %t: sm_cast <#userid|name|steamid>", "Prefix", "Use"); + return Plugin_Handled; + } -// Caster System -StringMap casterTrie; -StringMap allowedCastersTrie; -bool forbidSelfRegister; + if (!g_cvSefRegEnable.BoolValue && !bIsAdmin) + { + CPrintToChat(iClient, "%t %t", "Prefix", "SelfRegDisabled"); + return Plugin_Handled; + } -ConVar g_hDisableAddons; + char szAuthId[STEAMID2_LENGTH]; + GetClientAuthId(iClient, AuthId_Steam2, szAuthId, sizeof(szAuthId)); -public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) -{ - CreateNative("IsClientCaster", Native_IsClientCaster); - CreateNative("IsIDCaster", Native_IsIDCaster); + if (g_cvWhitelistEnable) + { + if (g_smWhitelist.Size == 0 && !bIsAdmin) + { + CPrintToChat(iClient, "%t %t", "Prefix", "WhitelistEmpty"); + return Plugin_Handled; + } - RegPluginLibrary("caster_system"); - return APLRes_Success; -} + if (!g_smWhitelist.GetValue(szAuthId, g_iDummy) && !bIsAdmin) + { + CPrintToChat(iClient, "%t %t", "Prefix", "SelfRegWhitelistNotFound"); + return Plugin_Handled; + } + } -public void OnPluginStart() -{ - LoadPluginTranslation(); - - casterTrie = new StringMap(); - allowedCastersTrie = new StringMap(); - - g_hDisableAddons = CreateConVar("caster_disable_addons", "0", "Whether to disallow addons on casters", FCVAR_NOTIFY, true, 0.0, true, 1.0); - g_hDisableAddons.AddChangeHook(OnAddonsSettingChanged); - - // Caster Registration - RegAdminCmd("sm_caster", Caster_Cmd, ADMFLAG_BAN, "Registers a player as a caster"); - RegAdminCmd("sm_resetcasters", ResetCaster_Cmd, ADMFLAG_BAN, "Used to reset casters between matches. This should be in confogl_off.cfg or equivalent for your system"); - RegAdminCmd("sm_add_caster_id", AddCasterSteamID_Cmd, ADMFLAG_BAN, "Used for adding casters to the whitelist -- i.e. who's allowed to self-register as a caster"); - RegAdminCmd("sm_remove_caster_id", RemoveCasterSteamID_Cmd, ADMFLAG_BAN, "Used for removing casters to the whitelist -- i.e. who's allowed to self-register as a caster"); - RegAdminCmd("sm_printcasters", PrintCasters_Cmd, ADMFLAG_BAN, "Used for print casters in the whitelist"); - RegConsoleCmd("sm_cast", Cast_Cmd, "Registers the calling player as a caster"); - RegConsoleCmd("sm_notcasting", NotCasting_Cmd, "Deregister yourself as a caster or allow admins to deregister other players"); - RegConsoleCmd("sm_uncast", NotCasting_Cmd, "Deregister yourself as a caster or allow admins to deregister other players"); - - // Kick Specs - RegConsoleCmd("sm_kickspecs", KickSpecs_Cmd, "Let's vote to kick those Spectators!"); - - HookEvent("player_team", PlayerTeam_Event); + if (g_smCaster.GetValue(szAuthId, g_iDummy)) + { + CReplyToCommand(iClient, "%t %t", "Prefix", "SelfRegCasterFound"); + return Plugin_Handled; + } + + if (!g_smCaster.SetValue(szAuthId, true)) + { + CReplyToCommand(iClient, "%t %t", "Prefix", "CasterRegError", szAuthId); + return Plugin_Handled; + } + + if (L4D_GetClientTeam(iClient) != L4DTeam_Spectator) + ChangeClientTeam(iClient, view_as(L4DTeam_Spectator)); + +#if DEBUG_API + LogMessage("[forward OnCaster] eTypeID: %d | iClient: %d | szAuthId: %s", kClient, iClient, szAuthId); +#endif + + Call_StartForward(g_gfOnCaster); + Call_PushCell(kClient); + Call_PushCell(iClient); + Call_PushString(szAuthId); + Call_Finish(); + + CPrintToChat(iClient, "%t %t", "Prefix", "SelfRegSuccess"); + CPrintToChat(iClient, "%t %t", "Prefix", "CasterReconnect"); + return Plugin_Handled; } -void LoadPluginTranslation() +Action aSelfRemoveCastCmd(int iClient, int iArgs) { - char sPath[PLATFORM_MAX_PATH]; - - BuildPath(Path_SM, sPath, sizeof sPath, "translations/" ... TRANSLATION_COMMON ... ".txt"); - if (!FileExists(sPath)) + if (iArgs == 0) + { + if (iClient == SERVER_INDEX) + { + CReplyToCommand(iClient, "%t %t: sm_uncast <#userid|name|steamid>", "Prefix", "Use"); + return Plugin_Handled; + } + + char szAuthId[STEAMID2_LENGTH]; + GetClientAuthId(iClient, AuthId_Steam2, szAuthId, sizeof(szAuthId)); + + char szName[16]; + GetClientName(iClient, szName, sizeof(szName)); + + if (!g_smCaster.GetValue(szAuthId, g_iDummy)) + { + CReplyToCommand(iClient, "%t %t", "Prefix", "CasterNoFound", szName); + return Plugin_Handled; + } + + CPrintToChat(iClient, "%t %t", "Prefix", "Reconnect"); + g_smCaster.Remove(szAuthId); + +#if DEBUG_API + LogMessage("[forward OffCaster] eTypeID: %d | iClient: %d | szAuthId: %s", kClient, iClient, szAuthId); +#endif + + Call_StartForward(g_gfOffCaster); + Call_PushCell(kClient); + Call_PushCell(iClient); + Call_PushString(szAuthId); + Call_Finish(); + + CreateTimer(3.0, aReconnectTimer, iClient); + return Plugin_Handled; + } + + if (g_smCaster.Size == 0) { - SetFailState("Missing translation file \"" ... TRANSLATION_COMMON ... ".txt\""); + CPrintToChat(iClient, "%t %t", "Prefix", "CasterEmpty"); + return Plugin_Handled; } - LoadTranslations(TRANSLATION_COMMON); - - BuildPath(Path_SM, sPath, sizeof sPath, "translations/" ... TRANSLATION_CASTER ... ".txt"); - if (!FileExists(sPath)) + + AdminId aAdminId = GetUserAdmin(iClient); + if (aAdminId == INVALID_ADMIN_ID || !GetAdminFlag(aAdminId, Admin_Ban)) // Check for specific admin flag { - SetFailState("Missing translation file \"" ... TRANSLATION_CASTER ... ".txt\""); + CReplyToCommand(iClient, "%t %t", "Prefix", "UnRegCasterNonAdmin"); + return Plugin_Handled; } - LoadTranslations(TRANSLATION_CASTER); + + char szArguments[256]; + GetCmdArgString(szArguments, sizeof(szArguments)); + FakeClientCommandEx(iClient, "sm_caster_rm %s", szArguments); + return Plugin_Handled; } +Action aReconnectTimer(Handle timer, int client) +{ + if (IsClientConnected(client)) + ReconnectClient(client); + return Plugin_Stop; +} // ======================== -// Natives +// SQL // ======================== - -int Native_IsClientCaster(Handle plugin, int numParams) +public void OnConfigsExecuted() { - int client = GetNativeCell(1); - return IsClientCaster(client); -} + if (!g_cvSQLEnable.BoolValue) + return; -int Native_IsIDCaster(Handle plugin, int numParams) -{ - char buffer[64]; - GetNativeString(1, buffer, sizeof(buffer)); - return IsIDCaster(buffer); + vConnectDB("castersystem", g_szTable); + + DataPack pDataPack = new DataPack(); + pDataPack.WriteCell(SERVER_INDEX); + pDataPack.WriteCell(SM_REPLY_TO_CONSOLE); + + vQueryWhitelist(pDataPack); } -bool IsClientCaster(int client) +public void OnPluginEnd() { - char buffer[64]; - return GetClientAuthId(client, AuthId_Steam2, buffer, sizeof(buffer)) && IsIDCaster(buffer); + if (!g_cvSQLEnable.BoolValue) + return; + + if (g_hDatabase == null) + return; + + delete g_hDatabase; } -bool IsIDCaster(const char[] AuthID) +void vQueryWhitelist(DataPack pDataPack) { - bool dummy; - return GetTrieValue(casterTrie, AuthID, dummy); -} + if (g_hDatabase == null) + return; + char szQuery[64]; + g_hDatabase.Format(szQuery, sizeof(szQuery), "SELECT * FROM `%s`", g_szTable); +#if DEBUG_SQL + LogMessage("[vQueryWhitelist] Query: %s", szQuery); +#endif -// ======================== -// Caster Addons -// ======================== + SQL_TQuery(g_hDatabase, vSQLCallback, szQuery, pDataPack); +} -void OnAddonsSettingChanged(ConVar convar, const char[] oldValue, const char[] newValue) +public void vSQLCallback(Handle hDatabase, Handle hResult, const char[] szError, any data) { - bool disable = !!StringToInt(newValue); - bool previous = !!StringToInt(oldValue); - - if (disable == previous) return; - - if (disable) + DataPack pDataPack = view_as(data); + pDataPack.Reset(); + int iUserId = pDataPack.ReadCell(); + int iClient = GetClientOfUserId(iUserId); + delete pDataPack; + + if (hResult == null) { - ArrayList hCastersList = new ArrayList(); - for (int i = 1; i <= MaxClients; i++) - { - if (IsClientInGame(i) && IsClientCaster(i)) - { - CPrintToChat(i, "%t", "ForbidAddons"); - CPrintToChat(i, "%t", "Reconnect1"); - CPrintToChat(i, "%t", "Reconnect2"); - hCastersList.Push(GetClientUserId(i)); - } - } - - if (!hCastersList.Length) - { - delete hCastersList; - return; - } - - // Reconnection to disable their addons - CreateTimer(3.0, Timer_ReconnectCasters, hCastersList, TIMER_FLAG_NO_MAPCHANGE | TIMER_DATA_HNDL_CLOSE); + char szErrorMsg[128]; + Format(szErrorMsg, sizeof(szErrorMsg), "%T: %s", "SQLError", LANG_SERVER, szError); + + if (iClient == SERVER_INDEX) + CReplyToCommand(iClient, "%t %t", "Prefix", "SQLError"); + else + CPrintToChat(iClient, "%t %t", "Prefix", "SQLError"); + + CRemoveTags(szErrorMsg, sizeof(szErrorMsg)); + LogError("[vSQLCallback] %s", szErrorMsg); + return; } - else + + g_smWhitelist.Clear(); + while (SQL_FetchRow(hResult)) { - for (int i = 1; i <= MaxClients; i++) + char szAuthId[STEAMID2_LENGTH]; + SQL_FetchString(hResult, 1, szAuthId, sizeof(szAuthId)); + + if (!g_smWhitelist.SetValue(szAuthId, 1)) { - if (IsClientInGame(i) && IsClientCaster(i)) - { - CPrintToChat(i, "%t", "AllowAddons"); - CPrintToChat(i, "%t", "SelfCast2"); - } + if (iClient == SERVER_INDEX) + CReplyToCommand(iClient, "%t %t", "Prefix", "WhitelistRegError", szAuthId); + else + CPrintToChat(iClient, "%t %t", "Prefix", "WhitelistRegError", szAuthId); } } -} - -Action Timer_ReconnectCasters(Handle timer, ArrayList aList) -{ - int size = aList.Length; - for (int i = 0; i < size; i++) - { - int client = GetClientOfUserId(aList.Get(i)); - if (client > 0) ReconnectClient(client); - } - return Plugin_Stop; + delete hResult; } -public Action L4D2_OnClientDisableAddons(const char[] SteamID) -{ - return (!g_hDisableAddons.BoolValue && IsIDCaster(SteamID)) ? Plugin_Handled : Plugin_Continue; -} +// ======================== +// Kick Specs +// ======================== -void PlayerTeam_Event(Event event, const char[] name, bool dontBroadcast) +Action aKickSpecsCmd(int iClient, int iArgs) { - if (event.GetInt("team") != L4D2Team_Spectator) + AdminId aAdminId = GetUserAdmin(iClient); + if (aAdminId != INVALID_ADMIN_ID && GetAdminFlag(aAdminId, Admin_Ban)) { - int userid = event.GetInt("userid"); - CreateTimer(1.0, CasterCheck, userid, TIMER_FLAG_NO_MAPCHANGE); + CreateTimer(2.0, aTimerKickSpecs); + CPrintToChatAll("%t %t", "Prefix", "KickSpecsAdmin", iClient); + return Plugin_Handled; } -} -Action CasterCheck(Handle timer, int userid) -{ - int client = GetClientOfUserId(userid); - if (client && IsClientInGame(client) && GetClientTeam(client) != L4D2Team_Spectator && IsClientCaster(client)) + if (L4D_GetClientTeam(iClient) == L4DTeam_Spectator) { - CPrintToChat(client, "%t", "CasterCheck1"); - CPrintToChat(client, "%t", "CasterCheck2"); - ChangeClientTeam(client, L4D2Team_Spectator); + CPrintToChat(iClient, "%t %t", "Prefix", "KickSpecsVoteSpec"); + return Plugin_Handled; } - return Plugin_Stop; + vStartKickSpecsVote(iClient); + return Plugin_Handled; } // ======================== -// Caster Registration +// Vote // ======================== -Action Cast_Cmd(int client, int args) +void vStartKickSpecsVote(int iClient) { - if (!client) return Plugin_Continue; - - char buffer[64]; - GetClientAuthId(client, AuthId_Steam2, buffer, sizeof(buffer)); - - bool temp; - if (forbidSelfRegister) + if (IsBuiltinVoteInProgress()) { - if (!allowedCastersTrie.GetValue(buffer, temp)) - { - CPrintToChat(client, "%t", "SelfCastNotAllowed"); - return Plugin_Handled; - } + CPrintToChat(iClient, "%t %t", "Prefix", "VoteInProgress"); + return; } - - if (!casterTrie.GetValue(buffer, temp)) + if (CheckBuiltinVoteDelay() > 0) { - if (GetClientTeam(client) != L4D2Team_Spectator) - { - ChangeClientTeam(client, L4D2Team_Spectator); - } - casterTrie.SetValue(buffer, true); - CPrintToChat(client, "%t", "SelfCast1"); - CPrintToChat(client, "%t", "SelfCast2"); + CPrintToChat(iClient, "%t %t", "Prefix", "VoteDelay", CheckBuiltinVoteDelay()); + return; } - - return Plugin_Handled; -} -Action Caster_Cmd(int client, int args) -{ - if (args < 1) + Handle hVote = CreateBuiltinVote(vVoteActionHandler, BuiltinVoteType_Custom_YesNo, + BuiltinVoteAction_Cancel | BuiltinVoteAction_VoteEnd | BuiltinVoteAction_End); + + char szBuffer[128]; + FormatEx(szBuffer, sizeof(szBuffer), "%T", "KickSpecsVoteTitle", LANG_SERVER); + SetBuiltinVoteArgument(hVote, szBuffer); + SetBuiltinVoteInitiator(hVote, iClient); + SetBuiltinVoteResultCallback(hVote, vKickSpecsVoteResultHandler); + + int iTotal = 0; + int[] aiPlayers = new int[MaxClients]; + for (int i = 1; i <= MaxClients; i++) { - ReplyToCommand(client, "[SM] Usage: sm_caster "); - return Plugin_Handled; + if (!IsClientInGame(i) || IsFakeClient(i) || L4D_GetClientTeam(iClient) == L4DTeam_Spectator) + continue; + aiPlayers[iTotal++] = i; } - - char buffer[64]; - GetCmdArg(1, buffer, sizeof(buffer)); - - int target = FindTarget(client, buffer, true, false); - if (target > 0) // If FindTarget fails we don't need to print anything as it prints it for us! + DisplayBuiltinVote(hVote, aiPlayers, iTotal, FindConVar("sv_vote_timer_duration").IntValue); + + FakeClientCommand(iClient, "Vote Yes"); +} + +void vVoteActionHandler(Handle hVote, BuiltinVoteAction eAction, int iParam1, int iParam2) +{ + switch (eAction) { - if (GetClientAuthId(target, AuthId_Steam2, buffer, sizeof(buffer))) + case BuiltinVoteAction_End: { - casterTrie.SetValue(buffer, true); - ReplyToCommand(client, "\x01%t", "RegCasterReply", target); - CPrintToChat(target, "%t", "RegCasterTarget", client); - CPrintToChat(target, "%t", "SelfCast2"); + CloseHandle(hVote); } - else + case BuiltinVoteAction_Cancel: { - ReplyToCommand(client, "\x01%t", "CasterSteamIDError"); + DisplayBuiltinVoteFail(hVote, BuiltinVoteFail_Generic); } } - - return Plugin_Handled; } -Action NotCasting_Cmd(int client, int args) +void vKickSpecsVoteResultHandler(Handle hVote, int iNumVotes, int iNumClients, const int[][] aiClientInfo, int iNumItems, const int[][] aiItemInfo) { - char buffer[64]; - - if (args < 1) // If no target is specified, assumes self-uncasting - { - GetClientAuthId(client, AuthId_Steam2, buffer, sizeof(buffer)); - if (casterTrie.Remove(buffer)) - { - CPrintToChat(client, "%t", "Reconnect1"); - CPrintToChat(client, "%t", "Reconnect2"); - - // Reconnection to disable their addons - CreateTimer(3.0, Reconnect, client); - } - } - else // If a target is specified + for (int i = 0; i < iNumItems; i++) { - AdminId id = GetUserAdmin(client); - if (id == INVALID_ADMIN_ID || !GetAdminFlag(id, Admin_Ban)) // Check for specific admin flag - { - ReplyToCommand(client, "\x01%t", "UnregCasterNonAdmin"); - return Plugin_Handled; - } - - GetCmdArg(1, buffer, sizeof(buffer)); - - int target = FindTarget(client, buffer, true, true); - if (target > 0) // If FindTarget fails we don't need to print anything as it prints it for us! + if (aiItemInfo[i][BUILTINVOTEINFO_ITEM_INDEX] == BUILTINVOTES_VOTE_YES) { - if (GetClientAuthId(target, AuthId_Steam2, buffer, sizeof(buffer))) - { - if (casterTrie.Remove(buffer)) - { - CPrintToChat(target, "%t", "UnregCasterTarget", client); - NotCasting_Cmd(target, 0); - } - ReplyToCommand(client, "\x01%t", "UnregCasterSuccess", target); - } - else + if (aiItemInfo[i][BUILTINVOTEINFO_ITEM_VOTES] > (iNumClients / 2)) { - ReplyToCommand(client, "\x01%t", "CasterSteamIDError"); + char szBuffer[64]; + FormatEx(szBuffer, sizeof(szBuffer), "%T", "KickSpecsVoteSuccess", LANG_SERVER); + DisplayBuiltinVotePass(hVote, szBuffer); + + float fDelay = FindConVar("sv_vote_command_delay").FloatValue; + CreateTimer(fDelay, aTimerKickSpecs); + return; } } } - return Plugin_Handled; + + DisplayBuiltinVoteFail(hVote, BuiltinVoteFail_Loses); } -Action Reconnect(Handle timer, int client) +Action aTimerKickSpecs(Handle hTimer) { - if (IsClientConnected(client)) ReconnectClient(client); + for (int i = 1; i <= MaxClients; i++) + { + if (!IsClientInGame(i) || IsFakeClient(i)) + continue; + if (L4D_GetClientTeam(i) != L4DTeam_Spectator) + continue; + if (bCaster(kClient, i)) + continue; + if (GetUserAdmin(i) != INVALID_ADMIN_ID) + continue; + if (bSpecInmunity(kClient, i)) + continue; + KickClient(i, "%t", "KickSpecsReason"); + } return Plugin_Stop; } -Action ResetCaster_Cmd(int client, int args) +/** + * Check if the translation file exists + * + * @param szTranslation Translation name. + * @noreturn + */ +stock void vLoadTranslation(const char[] szTranslation) { - casterTrie.Clear(); - forbidSelfRegister = false; - ReplyToCommand(client, "\x01%t", "CasterDBReset"); - return Plugin_Handled; + char szPath[PLATFORM_MAX_PATH], + szName[64]; + + Format(szName, sizeof(szName), "translations/%s.txt", szTranslation); + BuildPath(Path_SM, szPath, sizeof(szPath), szName); + if (!FileExists(szPath)) + SetFailState("Missing translation file %s.txt", szTranslation); + + LoadTranslations(szTranslation); } -Action AddCasterSteamID_Cmd(int client, int args) +/** + * Checks if a client or an AuthID is a caster. + * + * @param etType The type of identifier being used (kClient or kAuth). + * @param iClient The client index (optional, default is 0). + * @param szAuthId The AuthID string (optional, default is an empty string). + * @return True if the client or AuthID is a caster, false otherwise. + */ +bool bCaster(eTypeID eID, int iClient = 0, const char[] szAuthId = "") { - char buffer[128]; - GetCmdArg(1, buffer, sizeof(buffer)); - if (buffer[0] != EOS) + switch (eID) { - forbidSelfRegister = true; - if (allowedCastersTrie.SetValue(buffer, 1, false)) + case kClient: + { + char szClientAuthId[STEAMID2_LENGTH]; + GetClientAuthId(iClient, AuthId_Steam2, szClientAuthId, sizeof(szClientAuthId)); + return g_smCaster.GetValue(szClientAuthId, g_iDummy); + } + case kAuth: { - ReplyToCommand(client, "\x01%t", "CasterDBAdd", buffer); + return g_smCaster.GetValue(szAuthId, g_iDummy); } - else ReplyToCommand(client, "\x01%t", "CasterDBFound", buffer); } - else ReplyToCommand(client, "\x01%t", "CasterDBError"); - return Plugin_Handled; + return false; } -Action RemoveCasterSteamID_Cmd(int client, int args) +/** + * Checks if a client or an AuthID has spectator immunity. + * + * @param eTypeID The type of identifier being used (kClient or kAuth). + * @param iClient The client index (only used if eTypeID is kClient). + * @param szAuthId The AuthID string (only used if eTypeID is kAuth). + * @return True if the client or AuthID has spectator immunity, false otherwise. + */ +bool bSpecInmunity(eTypeID eID, int iClient = 0, const char[] szAuthId = "") { - char buffer[128]; - GetCmdArg(1, buffer, sizeof(buffer)); - if (buffer[0] != EOS) + switch (eID) { - int dummy; - if (allowedCastersTrie.GetValue(buffer, dummy)) + case kClient: + { + char szClientAuthId[STEAMID2_LENGTH]; + GetClientAuthId(iClient, AuthId_Steam2, szClientAuthId, sizeof(szClientAuthId)); + return g_smSpecInmunity.GetValue(szClientAuthId, g_iDummy); + } + case kAuth: { - allowedCastersTrie.Remove(buffer); - if (allowedCastersTrie.Size == 0) forbidSelfRegister = false; - ReplyToCommand(client, "\x01%t", "CasterDBRemove", buffer); + return g_smSpecInmunity.GetValue(szAuthId, g_iDummy); } - else ReplyToCommand(client, "\x01%t", "CasterDBFound", buffer); } - else ReplyToCommand(client, "\x01%t", "CasterDBError"); - return Plugin_Handled; + return false; } -Action PrintCasters_Cmd(int client, int args) +/** + * @brief Checks if a given string is a valid Steam ID. + * + * This function verifies if the provided string follows the format of a Steam ID. + * A valid Steam ID should start with "STEAM_" and contain two colons separating + * three numerical components. + * + * @param szAuthId The string to be checked. + * @return True if the string is a valid Steam ID, false otherwise. + */ +bool bIsSteamId(const char[] szAuthId) { - StringMapSnapshot ss = allowedCastersTrie.Snapshot(); - char buffer[128]; - - if (GetCmdReplySource() == SM_REPLY_TO_CHAT) + if (strlen(szAuthId) == 0) + return false; + + if (StrContains(szAuthId, "STEAM_") != 0) + return false; + + int iPos1 = FindCharInString(szAuthId, ':'); + if (iPos1 == NO_INDEX) + return false; + + int iPos2 = FindCharInString(szAuthId, ':', iPos1 + 1); + if (iPos2 == NO_INDEX) + return false; + + char szUniverse[8]; + char szAuth[8]; + char szAccount[16]; + + int iLenUniverse = iPos1 - 6; + if (iLenUniverse <= 0 || iLenUniverse >= sizeof(szUniverse)) + return false; + + for (int i = 0; i < iLenUniverse; i++) + { + szUniverse[i] = szAuthId[6 + i]; + } + szUniverse[iLenUniverse] = '\0'; + + int iLenAuth = iPos2 - iPos1 - 1; + if (iLenAuth <= 0 || iLenAuth >= sizeof(szAuth)) + return false; + + for (int i = 0; i < iLenAuth; i++) { - if (client > 0) PrintToChat(client, "[casters_database] List is printed in console"); + szAuth[i] = szAuthId[iPos1 + 1 + i]; } - - PrintToConsole(client, "/***********[casters_database]***********\\"); - - int len = ss.Length; - for (int i = 0; i < len; i++) + szAuth[iLenAuth] = '\0'; + + int iLenAccount = strlen(szAuthId) - iPos2 - 1; + if (iLenAccount <= 0 || iLenAccount >= sizeof(szAccount)) + return false; + + for (int i = 0; i < iLenAccount; i++) { - ss.GetKey(i, buffer, sizeof buffer); - PrintToConsole(client, "Caster #%i: %s", i+1, buffer); + szAccount[i] = szAuthId[iPos2 + 1 + i]; } - PrintToConsole(client, ">* Total Casters: %i", len); - - delete ss; - return Plugin_Handled; -} + szAccount[iLenAccount] = '\0'; + if (!bIsInteger(szUniverse) || !bIsInteger(szAuth) || !bIsInteger(szAccount)) + return false; + return true; +} -// ======================== -// Kick Specs -// ======================== +/** + * @brief Checks if the given string represents an integer. + * + * This function iterates through each character of the input string and + * verifies if all characters are numeric. + * + * @param szString The string to be checked. + * @return True if the string represents an integer, false otherwise. + */ +bool bIsInteger(const char[] szString) +{ + int iLen = strlen(szString); + for (int i = 0; i < iLen; i++) + { + if (!IsCharNumeric(szString[i])) + return false; + } + return true; +} -Action KickSpecs_Cmd(int client, int args) +/** + * Connects to the database using the specified configuration name. + * + * @param szConfigName The name of the database configuration to use for the connection. + * + * This function checks if the specified database configuration exists. If it does not, + * it logs an error message and sets the global variable `g_bSQLConnected` to false. + * If the configuration exists, it attempts to connect to the database using the provided + * configuration name and calls the `vConnectCallback` function upon completion. + */ +stock void vConnectDB(char[] szConfigName, char[] szTable = "") { - AdminId id = GetUserAdmin(client); - if (id != INVALID_ADMIN_ID && GetAdminFlag(id, Admin_Ban)) // Check for specific admin flag + if (!SQL_CheckConfig(szConfigName)) { - CreateTimer(2.0, Timer_KickSpecs); - CPrintToChatAll("%t", "KickSpecsAdmin", client); - return Plugin_Handled; + g_bSQLConnected = false; + return; } - - // Filter spectator - if (GetClientTeam(client) == L4D2Team_Spectator) + + if (szTable[0] == '\0') { - CPrintToChat(client, "%t", "KickSpecsVoteSpec"); - return Plugin_Handled; + Database.Connect(vConnectCallback, szConfigName); + return; } - - StartKickSpecsVote(client); - return Plugin_Handled; -} -// ======================== -// Vote -// ======================== + DataPack pDataPack = new DataPack(); + pDataPack.WriteString(szTable); + Database.Connect(vConnectCallback, szConfigName, pDataPack); +} -void StartKickSpecsVote(int client) +/** + * Callback function for handling database connection. + * + * @param hDatabase The database connection object. + * @param szError The error message if the connection failed. + * @param pData Additional data passed to the callback. + * + * This function is called when a connection to the database is attempted. + * It logs the success or failure of the connection, sets the database charset to UTF-8, + * and determines the SQL driver being used. It also checks if table exists. + */ +stock void vConnectCallback(Database hDatabase, const char[] szError, any pData) { - if (IsBuiltinVoteInProgress()) + if (hDatabase == null) { - CPrintToChat(client, "%t", "VoteInProgress"); + g_bSQLConnected = false; return; } - if (CheckBuiltinVoteDelay() > 0) + + if (szError[0] != '\0') { - CPrintToChat(client, "%t", "VoteDelay", CheckBuiltinVoteDelay()); + g_bSQLConnected = false; return; } - - Handle hVote = CreateBuiltinVote(VoteActionHandler, BuiltinVoteType_Custom_YesNo, BuiltinVoteAction_Cancel | BuiltinVoteAction_VoteEnd | BuiltinVoteAction_End); - - char sBuffer[128]; - FormatEx(sBuffer, sizeof(sBuffer), "%T", "KickSpecsVoteTitle", LANG_SERVER); - SetBuiltinVoteArgument(hVote, sBuffer); - SetBuiltinVoteInitiator(hVote, client); - SetBuiltinVoteResultCallback(hVote, KickSpecsVoteResultHandler); - - // Display to players - int total = 0; - int[] players = new int[MaxClients]; - for (int i = 1; i <= MaxClients; i++) + + g_bSQLConnected = true; + g_hDatabase = hDatabase; + + char szDriver[64]; + SQL_ReadDriver(hDatabase, szDriver, sizeof(szDriver)); + + if (StrEqual(szDriver, "mysql")) { - if (!IsClientInGame(i) || IsFakeClient(i) || GetClientTeam(i) == L4D2Team_Spectator) - continue; - players[total++] = i; + g_iSQLDriver = kMySQL; + hDatabase.SetCharset("utf8"); } - DisplayBuiltinVote(hVote, players, total, FindConVar("sv_vote_timer_duration").IntValue); + else if (StrEqual(szDriver, "sqlite")) + g_iSQLDriver = kSQLite; + + if (pData == 0) + return; - // Client is voting for - FakeClientCommand(client, "Vote Yes"); + char szTable[64]; + DataPack pDataPack = view_as(pData); + + pDataPack.Reset(); + pDataPack.ReadString(szTable, sizeof(szTable)); + delete pDataPack; + g_bSQLTableExists = bTableExists(szTable); + + if (!g_bSQLTableExists) + vCreateSQL(); } -void VoteActionHandler(Handle vote, BuiltinVoteAction action, int param1, int param2) +/** + * Creates the SQL table if it does not already exist. + * The table structure depends on the SQL driver being used (MySQL or SQLite). + * + * MySQL: + * - Table name: g_szTable + * - Columns: + * - `id`: INT, AUTO_INCREMENT, PRIMARY KEY + * - `authid`: VARCHAR(64), NOT NULL, DEFAULT '', COMMENT 'Client in the whitelistList' + * - `serverid`: INT, NOT NULL, DEFAULT 0, COMMENT 'Server identification' + * + * SQLite: + * - Table name: g_szTable + * - Columns: + * - `id`: INTEGER, PRIMARY KEY AUTOINCREMENT + * - `authid`: TEXT, NOT NULL, DEFAULT '' + * - `serverid`: INTEGER, NOT NULL, DEFAULT 0 + * + * If the table creation fails, an error is logged. + * If the table is created successfully, a message is printed to the server. + * + * @return void + */ +void vCreateSQL() { - switch (action) + char szQuery[600]; + switch (g_iSQLDriver) { - case BuiltinVoteAction_End: + case kMySQL: { - CloseHandle(vote); + g_hDatabase.Format(szQuery, sizeof(szQuery), + "CREATE TABLE IF NOT EXISTS `%s` ( \ + `id` INT AUTO_INCREMENT PRIMARY KEY, \ + `authid` VARCHAR(64) NOT NULL DEFAULT '' COMMENT 'Client in the whitelistList', \ + `serverid` INT NOT NULL DEFAULT 0 COMMENT 'Server identification' \ + ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci", + g_szTable); } - case BuiltinVoteAction_Cancel: + case kSQLite: { - DisplayBuiltinVoteFail(vote, BuiltinVoteFail_Generic); + g_hDatabase.Format(szQuery, sizeof(szQuery), + "CREATE TABLE IF NOT EXISTS `%s` ( \ + `id` INTEGER PRIMARY KEY AUTOINCREMENT, \ + `authid` TEXT NOT NULL DEFAULT '' \ + `serverid` INTEGER NOT NULL DEFAULT 0, \ + )", + g_szTable); } } + +#if DEBUG_SQL + LogMessage("[CreateSQL] Table created: %s", g_szTable); +#endif + + if (!SQL_FastQuery(g_hDatabase, szQuery)) + { + logErrorSQL(g_hDatabase, szQuery, "CreateSQL"); + return; + } + + g_bSQLTableExists = true; } -void KickSpecsVoteResultHandler(Handle vote, int num_votes, int num_clients, const int[][] client_info, int num_items, const int[][] item_info) +/** + * Checks if a table exists in the database. + * + * @param szTable The name of the table to check. + * @return True if the table exists, false otherwise. + */ +stock bool bTableExists(const char[] szTable) { - for (int i = 0; i < num_items; i++) + char szQuery[255]; + + switch (g_iSQLDriver) { - if (item_info[i][BUILTINVOTEINFO_ITEM_INDEX] == BUILTINVOTES_VOTE_YES) - { - if (item_info[i][BUILTINVOTEINFO_ITEM_VOTES] > (num_clients / 2)) - { - char buffer[64]; - FormatEx(buffer, sizeof(buffer), "%T", "KickSpecsVoteSuccess", LANG_SERVER); - DisplayBuiltinVotePass(vote, buffer); - - float delay = FindConVar("sv_vote_command_delay").FloatValue; - CreateTimer(delay, Timer_KickSpecs); - return; - } - } + case kMySQL: + g_hDatabase.Format(szQuery, sizeof(szQuery), "SHOW TABLES LIKE '%s'", szTable); + case kSQLite: + g_hDatabase.Format(szQuery, sizeof(szQuery), "SELECT name FROM sqlite_master WHERE type='table' AND name='%s'", szTable); } - DisplayBuiltinVoteFail(vote, BuiltinVoteFail_Loses); +#if DEBUG_SQL + LogMessage("[bTableExists] Query: %s", szQuery); +#endif + + DBResultSet hQueryTableExists = SQL_Query(g_hDatabase, szQuery); + if (hQueryTableExists == null) + return false; + + bool bExists = hQueryTableExists.FetchRow(); + delete hQueryTableExists; + + return bExists; +} + +/** + * Logs SQL errors and the corresponding query that caused the error. + * + * @param db The database connection handle. + * @param sQuery The SQL query that failed. + * @param sName The name of the source or context where the error occurred. + */ +void logErrorSQL(Database pDb, const char[] szQuery, const char[] szName) +{ + char szSQLError[250]; + SQL_GetError(pDb, szSQLError, sizeof(szSQLError)); + LogError("[%s] SQL failed: %s", szName, szSQLError); + LogError("[%s] Query dump: %s", szName, szQuery); } -Action Timer_KickSpecs(Handle timer) +/** + * Retrieves the client index of a player based on their Steam2 Auth ID. + * + * @param szAuthId The Steam2 Auth ID of the player to search for. + * @return The client index of the player if found, otherwise NO_INDEX. + */ +int GetClientOfAuthID(const char[] szAuthId) { for (int i = 1; i <= MaxClients; i++) { - if (!IsClientInGame(i) || IsFakeClient(i)) { continue; } - if (GetClientTeam(i) != L4D2Team_Spectator) { continue; } - if (IsClientCaster(i)) { continue; } - if (GetUserAdmin(i) != INVALID_ADMIN_ID) { continue; } - - KickClient(i, "%t", "KickSpecsReason"); - } + if (!IsClientInGame(i) || IsFakeClient(i)) + continue; - return Plugin_Stop; + char szClientAuthId[STEAMID2_LENGTH]; + GetClientAuthId(i, AuthId_Steam2, szClientAuthId, sizeof(szClientAuthId)); + + if (StrEqual(szClientAuthId, szAuthId)) + return i; + } + return NO_INDEX; } \ No newline at end of file diff --git a/addons/sourcemod/scripting/caster_system_test.sp b/addons/sourcemod/scripting/caster_system_test.sp new file mode 100644 index 000000000..9a6c74c26 --- /dev/null +++ b/addons/sourcemod/scripting/caster_system_test.sp @@ -0,0 +1,714 @@ +#pragma semicolon 1 +#pragma newdecls required + +#include +#include + +#undef REQUIRE_PLUGIN +#include +#define REQUIRE_PLUGIN + +#define STEAMID2_LENGTH 32 +#define PREFIX_TEST "[{olive}Test{default}]" + +bool + g_bLateload, + g_bCasterSystem; + + +enum eTypeList +{ + kCaster = 0, + kWhite = 1, + kSQL = 2 +} + +enum L4DTeam +{ + L4DTeam_Unassigned = 0, + L4DTeam_Spectator = 1, + L4DTeam_Survivor = 2, + L4DTeam_Infected = 3 +} + +public Plugin g_myInfo = +{ + name = "L4D2 Caster System Test", + author = "lechuga", + description = "Testing native and forward", + version = "1.0", + url = "https://github.com/SirPlease/L4D2-Competitive-Rework" +}; + +public APLRes AskPluginLoad2(Handle hMyself, bool bLate, char[] sError, int iErr_max) +{ + g_bLateload = bLate; + return APLRes_Success; +} + +public void OnAllPluginsLoaded() +{ + g_bCasterSystem = LibraryExists("caster_system"); +} + +public void OnLibraryAdded(const char[] sPluginName) +{ + if (StrEqual(sPluginName, "caster_system")) + g_bCasterSystem = true; +} + +public void OnLibraryRemoved(const char[] sPluginName) +{ + if (StrEqual(sPluginName, "caster_system")) + g_bCasterSystem = false; +} + +public void OnPluginStart() +{ + vLoadTranslation("common.phrases"); + vLoadTranslation("caster_system.phrases"); + + RegConsoleCmd("sm_tcaster", aTcasterRegCmd, "Registers a player to the caster list"); + RegConsoleCmd("sm_tcaster_rm", aTcasterRemoveCmd, "Removes a player from the caster list"); + + RegConsoleCmd("sm_tcaster_wl", aTwhitelistRegCmd, "Adds a player to the whitelist"); + RegConsoleCmd("sm_tcaster_wl_rm", aTwhitelistRemoveCmd, "Removes a player from the whitelist"); + + if (!g_bLateload) + return; + + g_bCasterSystem = LibraryExists("caster_system"); +} + +Action aTcasterRegCmd(int iClient, int iArgs) +{ + if (!g_bCasterSystem) + { + CPrintToChatAll("%s {red}Caster System{default} is not loaded", PREFIX_TEST); + return Plugin_Handled; + } + + ReplySource eRsCmd = GetCmdReplySource(); + if (iArgs == 0) + { + if (eRsCmd == SM_REPLY_TO_CHAT && iClient != SERVER_INDEX) + vDisplayRegMenu(iClient, kCaster); + else + CReplyToCommand(iClient, "%s %t: sm_tcaster <#userid|name|steamid>", PREFIX_TEST, "Use"); + return Plugin_Handled; + } + + char szArguments[64]; + GetCmdArgString(szArguments, sizeof(szArguments)); + + char szArg[STEAMID2_LENGTH]; + BreakString(szArguments, szArg, sizeof(szArg)); + + vProcessReg(iClient, szArg, kCaster); + + return Plugin_Handled; +} + +Action aTwhitelistRegCmd(int iClient, int iArgs) +{ + if (!g_bCasterSystem) + { + CPrintToChatAll("%s {red}Caster System{default} is not loaded", PREFIX_TEST); + return Plugin_Handled; + } + + ReplySource eRsCmd = GetCmdReplySource(); + if (iArgs == 0) + { + if (eRsCmd == SM_REPLY_TO_CHAT && iClient != SERVER_INDEX) + vDisplayRegMenu(iClient, kWhite); + else + CReplyToCommand(iClient, "%s %t: sm_tcaster_wl <#userid|name|steamid>", PREFIX_TEST, "Use"); + return Plugin_Handled; + } + + char szArguments[64]; + GetCmdArgString(szArguments, sizeof(szArguments)); + + char szArg[STEAMID2_LENGTH]; + BreakString(szArguments, szArg, sizeof(szArg)); + + vProcessReg(iClient, szArg, kWhite); + + return Plugin_Handled; +} + +/** + * Processes the registration of a client based on the provided argument. + * + * @param iClient The client index who initiated the registration. + * @param szArg The argument provided for registration, which can be a Steam ID or a target name. + * @param eTypeList The type list enumeration specifying the type of registration. + * + * If the provided argument is a Steam ID, the client is registered directly using the Steam ID. + * If the provided argument is a target name, the function attempts to find the target client and register them. + * If the target client is not found or their Steam ID cannot be retrieved, an error message is sent to the client. + */ +void vProcessReg(int iClient, const char[] szArg, eTypeList eList) +{ + if (bIsSteamId(szArg)) + { + vRegister(iClient, NO_INDEX, szArg, szArg, eList, kAuth); + return; + } + + int iTarget = FindTarget(iClient, szArg, true, false); + if (iTarget == NO_INDEX) + return; + + char szAuthId[STEAMID2_LENGTH]; + if (!GetClientAuthId(iTarget, AuthId_Steam2, szAuthId, sizeof(szAuthId))) + { + CReplyToCommand(iClient, "%t %t", "Prefix", "AuthIdError", szAuthId); + return; + } + + char szName[16]; + GetClientName(iTarget, szName, sizeof(szName)); + vRegister(iClient, iTarget, szAuthId, szName, eList, kClient); +} + +void vDisplayRegMenu(int iClient, eTypeList eList) +{ + Menu hMenu; + hMenu = new Menu(iRegMenuHandler); + char szTitle[100]; + Format(szTitle, sizeof(szTitle), "%t", "MenuPlayersList"); + hMenu.SetTitle(szTitle); + vListTargets(hMenu, eList); + + hMenu.Display(iClient, MENU_TIME_FOREVER); +} + +/** + * Populates a menu with a list of clients based on the specified type list. + * + * @param hMenu The menu handle to which the clients will be added. + * @param eTypeList The type of list to populate (e.g., kCaster, kWhite). + * + * This function iterates through all connected clients and adds them to the provided menu. + * It constructs an identifier for each client and appends the specified type list to it. + * Depending on the type list, it checks if the client is a caster or in the whitelist and + * adds them to the menu accordingly, disabling the item if they meet the criteria. + * + * The function skips clients that are not connected, are fake clients, or if their name or + * Steam ID cannot be retrieved. + */ +void vListTargets(Menu hMenu, eTypeList eList) +{ + char szName[64], szBuffer[16], szAuthId[STEAMID2_LENGTH]; + int iUserId; + + for (int i = 1; i <= MaxClients; i++) + { + if (!IsClientConnected(i) || IsFakeClient(i)) + continue; + + if (!GetClientName(i, szName, sizeof(szName))) + continue; + + if (!GetClientAuthId(i, AuthId_Steam2, szAuthId, sizeof(szAuthId))) + continue; + + // Construct an identifier and add the eTypeList to it + iUserId = GetClientUserId(i); + Format(szBuffer, sizeof(szBuffer), "%d:%d", iUserId, view_as(eList)); + + bool bIsCaster = (eList == kCaster) ? bCaster(kClient, kGet, i, szAuthId) : bCasterWhitelist(kClient, kGet, i, szAuthId); + hMenu.AddItem(szBuffer, szName, bIsCaster ? ITEMDRAW_DISABLED : ITEMDRAW_DEFAULT); + } +} + +public int iRegMenuHandler(Menu hMenu, MenuAction eAction, int iClient, int iItem) +{ + switch (eAction) + { + case MenuAction_Select: + { + char szInfo[32], szName[32]; + int iUserId, iTarget; + + hMenu.GetItem(iItem, szInfo, sizeof(szInfo), _, szName, sizeof(szName)); + + char szPart1[16], szPart2[16]; + int iIndex; + + iIndex = SplitString(szInfo, ":", szPart1, sizeof(szPart1)); + if (iIndex != -1) + SplitString(szInfo[iIndex], ":", szPart2, sizeof(szPart2)); + + int iPart1 = StringToInt(szPart1); + int iPart2 = StringToInt(szPart2); + + iUserId = iPart1; + eTypeList eList = view_as(iPart2); + + if ((iTarget = GetClientOfUserId(iUserId)) == SERVER_INDEX) + CPrintToChat(iClient, "%t %t", "Prefix", "Player no longer available"); + else if (!CanUserTarget(iClient, iTarget)) + CPrintToChat(iClient, "%t %t", "Prefix", "Unable to target"); + else + { + char szAuthId[STEAMID2_LENGTH]; + if (!GetClientAuthId(iTarget, AuthId_Steam2, szAuthId, sizeof(szAuthId))) + { + CReplyToCommand(iClient, "%t %t", "Prefix", "AuthIdError", szAuthId); + return Plugin_Handled; + } + + char szTargetName[16]; + GetClientName(iTarget, szTargetName, sizeof(szTargetName)); + + vRegister(iClient, iTarget, szAuthId, szTargetName, eList, kClient); + } + } + case MenuAction_End: + { + delete hMenu; + } + } + return 0; +} + +/** + * Registers a client or target with the specified type and ID. + * + * @param iClient The client index initiating the registration. + * @param iTarget The target index to be registered. + * @param szAuthId The authentication ID of the target. + * @param szDisplayName The display name of the target. + * @param eTypeList The type list indicating the registration type. + * @param eTypeID The type ID for the registration. + */ +void vRegister(int iClient, int iTarget, const char[] szAuthId, const char[] szDisplayName, eTypeList eList, eTypeID eId) +{ + bool bIndex = (eId == kClient); + bool bFound = false; + + switch (eList) + { + case kCaster: + bFound = bIndex ? bCaster(eId, kGet, iTarget, szAuthId) : bCaster(eId, kGet, NO_INDEX, szAuthId); + case kWhite: + bFound = bIndex ? bCasterWhitelist(eId, kGet, iTarget, szAuthId) : bCasterWhitelist(eId, kGet, NO_INDEX, szAuthId); + } + + if (bFound) + { + CReplyToCommand(iClient, "%t %t", "Prefix", eList == kCaster ? "CasterFound" : "WhitelistFound", szDisplayName); + return; + } + + switch (eList) + { + case kCaster: + bCaster(eId, kSet, iTarget, szAuthId); + case kWhite: + bCasterWhitelist(eId, kSet, iTarget, szAuthId); + } +} + +Action aTcasterRemoveCmd(int iClient, int iArgs) +{ + ReplySource eRsCmd = GetCmdReplySource(); + if (iArgs == 0) + { + if (eRsCmd == SM_REPLY_TO_CHAT && iClient != SERVER_INDEX) + vDisplayRemoveMenu(iClient, kCaster); + else + CReplyToCommand(iClient, "%t %t: sm_tcaster_rm <#userid|name|steamid>", "Prefix", "Use"); + return Plugin_Handled; + } + + char szArguments[64]; + GetCmdArgString(szArguments, sizeof(szArguments)); + + char szArg[STEAMID2_LENGTH]; + BreakString(szArguments, szArg, sizeof(szArg)); + + vProcessRemove(iClient, szArg, kCaster); + return Plugin_Handled; +} + +Action aTwhitelistRemoveCmd(int iClient, int iArgs) +{ + ReplySource eRsCmd = GetCmdReplySource(); + if (iArgs == 0) + { + if (eRsCmd == SM_REPLY_TO_CHAT && iClient != SERVER_INDEX) + vDisplayRemoveMenu(iClient, kWhite); + else + CReplyToCommand(iClient, "%t %t: sm_tcaster_wl_rm <#userid|name|steamid>", "Prefix", "Use"); + return Plugin_Handled; + } + + char szArguments[64]; + GetCmdArgString(szArguments, sizeof(szArguments)); + + char szArg[STEAMID2_LENGTH]; + BreakString(szArguments, szArg, sizeof(szArg)); + + vProcessRemove(iClient, szArg, kWhite); + return Plugin_Handled; +} + +/** + * Processes the removal of a client from a specified list. + * + * @param iClient The client index initiating the removal. + * @param szArg The argument provided, which can be a Steam ID or a target name. + * @param eList The list type from which the client should be removed. + * + * If the provided argument is a Steam ID, it directly calls the removal function. + * Otherwise, it attempts to find the target client by name and retrieves their Steam ID. + * If the Steam ID retrieval fails, it sends an error message to the initiating client. + * Finally, it calls the removal function with the appropriate parameters. + */ +void vProcessRemove(int iClient, const char[] szArg, eTypeList eList) +{ + if (bIsSteamId(szArg)) + { + vRemove(iClient, NO_INDEX, szArg, szArg, eList, kAuth); + return; + } + + int iTarget = FindTarget(iClient, szArg, true, false); + if (iTarget == NO_INDEX) + return; + + char szAuthId[STEAMID2_LENGTH]; + if (!GetClientAuthId(iTarget, AuthId_Steam2, szAuthId, sizeof(szAuthId))) + { + CReplyToCommand(iClient, "%t %t", "Prefix", "AuthIdError", szAuthId); + return; + } + + char szName[16]; + GetClientName(iTarget, szName, sizeof(szName)); + vRemove(iClient, iTarget, szAuthId, szName, eList, kClient); +} + +/** + * Removes a client from the specified list. + * + * @param iClient The client index who initiated the removal. + * @param iTarget The client index of the target to remove. + * @param szAuthId The Steam ID of the target client. + * @param szDisplayName The display name of the target client. + * @param eList The type list from which the client should be removed. + * @param eId The type ID to determine the removal operation. + * + * The function constructs a message to display to the initiating client and the target client. + * It then calls the removal function with the appropriate parameters based on the type list. + * If the removal operation fails, an error message is sent to the initiating client. + */ +void vRemove(int iClient, int iTarget, const char[] szAuthId, const char[] szDisplayName, eTypeList eList, eTypeID eId) +{ + bool bIndex = (iTarget > SERVER_INDEX); + bool bFound = false; + + switch (eList) + { + case kCaster: + bFound = bIndex ? bCaster(eId, kGet, iTarget, szAuthId) : bCaster(eId, kGet, NO_INDEX, szAuthId); + case kWhite: + bFound = bIndex ? bCasterWhitelist(eId, kGet, iTarget, szAuthId) : bCasterWhitelist(eId, kGet, NO_INDEX, szAuthId); + } + + if (!bFound) + { + CReplyToCommand(iClient, "%t %t", "Prefix", eList == kCaster ? "CasterNoFound" : "WhitelistNoFound", szDisplayName); + return; + } + + switch (eList) + { + case kCaster: + bCaster(eId, kRem, iTarget, szAuthId); + case kWhite: + bCasterWhitelist(eId, kRem, iTarget, szAuthId); + } +} + +void vDisplayRemoveMenu(int iClient, eTypeList eList) +{ + char szTitle[100]; + switch (eList) + { + case kCaster: + Format(szTitle, sizeof(szTitle), "%T", "MenuCastersList", iClient); + case kWhite: + Format(szTitle, sizeof(szTitle), "%T", "MenuWhitelistList", iClient); + } + + Menu hMenu = new Menu(iMenuRemove); + hMenu.SetTitle(szTitle); + vRemoveTargets(hMenu, eList, iClient); + + hMenu.Display(iClient, MENU_TIME_FOREVER); +} + +/** + * Removes targets from the specified menu based on the given type list. + * + * @param hMenu The menu handle to which the targets will be added. + * @param eList The type list to determine which targets to remove. + * @param iClient The client index who initiated the removal. + * + * This function iterates through all connected clients, checks if they match + * the criteria specified by the type list, and adds them to the menu if they do. + * If no targets are found, a message indicating no targets to remove is added + * to the menu. + */ +void vRemoveTargets(Menu hMenu, eTypeList eList, int iClient) +{ + char + szName[64], + szInfo[16], + szAuthId[STEAMID2_LENGTH]; + + bool + bFound; + + int + iTargets = 0; + + for (int i = 1; i <= MaxClients; i++) + { + if (!IsClientConnected(i) || IsFakeClient(i)) + continue; + + if (!GetClientName(i, szName, sizeof(szName))) + continue; + + if (!GetClientAuthId(i, AuthId_Steam2, szAuthId, sizeof(szAuthId))) + continue; + + Format(szInfo, sizeof(szInfo), "%d:%d", GetClientUserId(i), view_as(eList)); + + switch (eList) + { + case kCaster: + bFound = bCaster(kClient, kGet, i, szAuthId); + case kWhite: + bFound = bCasterWhitelist(kClient, kGet, i, szAuthId); + } + + if (bFound) + { + hMenu.AddItem(szInfo, szName); + iTargets++; + } + } + + if (iTargets == 0) + { + char szMsj[64]; + Format(szMsj, sizeof(szMsj), "%T", "NoTargetsToRemove", iClient); + hMenu.AddItem("", szMsj, ITEMDRAW_DISABLED); + } +} + +public int iMenuRemove(Menu hMenu, MenuAction eAction, int iClient, int iItem) +{ + if (eAction == MenuAction_Select) + { + char + szInfo[32], + szName[32], + szPart1[16], + szPart2[16]; + + int + iIndex, + iUserId, + iTarget; + + eTypeList + eList; + + hMenu.GetItem(iItem, szInfo, sizeof(szInfo), _, szName, sizeof(szName)); + + iIndex = SplitString(szInfo, ":", szPart1, sizeof(szPart1)); + SplitString(szInfo[iIndex], ":", szPart2, sizeof(szPart2)); + + iUserId = StringToInt(szPart1); + eList = view_as(StringToInt(szPart2)); + + if ((iTarget = GetClientOfUserId(iUserId)) == SERVER_INDEX) + CPrintToChat(iClient, "%t %t", "Prefix", "Player no longer available"); + else + { + char szAuthId[STEAMID2_LENGTH]; + if (!GetClientAuthId(iTarget, AuthId_Steam2, szAuthId, sizeof(szAuthId))) + { + CReplyToCommand(iClient, "%t %t", "Prefix", "AuthIdError", szAuthId); + return Plugin_Handled; + } + + vRemove(iClient, iTarget, szAuthId, szName, eList, kClient); + } + } + else if (eAction == MenuAction_End) + delete hMenu; + return 0; +} + +public void OnCaster(eTypeID eID, int iClient, const char[] szAuthId) +{ + + switch(eID) + { + case kClient: + { + LogMessage("[OnCaster] eTypeID: %d | iClient: %N", eID, iClient); + CPrintToChatAll("%s {blue}%N{default} was registered as a caster", PREFIX_TEST, iClient); + } + case kAuth: + { + LogMessage("[OnCaster] eTypeID: %d | szAuthId: %s", eID, szAuthId); + CPrintToChatAll("%s {blue}%s{default} was registered as a caster", PREFIX_TEST, szAuthId); + } + } +} + +public void OffCaster(eTypeID eID, int iClient, const char[] szAuthId) +{ + switch(eID) + { + case kClient: + { + LogMessage("[OffCaster] eTypeID: %d | iClient: %N", eID, iClient); + CPrintToChatAll("%s {red}%N{default} was removed from the casters list", PREFIX_TEST, iClient); + } + case kAuth: + { + LogMessage("[OffCaster] eTypeID: %d | szAuthId: %s", eID, szAuthId); + CPrintToChatAll("%s {red}%s{default} was removed from the casters list", PREFIX_TEST, szAuthId); + } + } +} + + +/** + * Returns the clients team using L4DTeam. + * + * @param client Player's index. + * @return Current L4DTeam of player. + * @error Invalid client index. + */ +stock L4DTeam L4D_GetClientTeam(int client) +{ + int team = GetClientTeam(client); + return view_as(team); +} + +/** + * @brief Checks if a given string is a valid Steam ID. + * + * This function verifies if the provided string follows the format of a Steam ID. + * A valid Steam ID should start with "STEAM_" and contain two colons separating + * three numerical components. + * + * @param szAuthId The string to be checked. + * @return True if the string is a valid Steam ID, false otherwise. + */ +bool bIsSteamId(const char[] szAuthId) +{ + if (strlen(szAuthId) == 0) + return false; + + if (StrContains(szAuthId, "STEAM_") != 0) + return false; + + int iPos1 = FindCharInString(szAuthId, ':'); + if (iPos1 == NO_INDEX) + return false; + + int iPos2 = FindCharInString(szAuthId, ':', iPos1 + 1); + if (iPos2 == NO_INDEX) + return false; + + char szUniverse[8]; + char szAuth[8]; + char szAccount[16]; + + int iLenUniverse = iPos1 - 6; + if (iLenUniverse <= 0 || iLenUniverse >= sizeof(szUniverse)) + return false; + + for (int i = 0; i < iLenUniverse; i++) + { + szUniverse[i] = szAuthId[6 + i]; + } + szUniverse[iLenUniverse] = '\0'; + + int iLenAuth = iPos2 - iPos1 - 1; + if (iLenAuth <= 0 || iLenAuth >= sizeof(szAuth)) + return false; + + for (int i = 0; i < iLenAuth; i++) + { + szAuth[i] = szAuthId[iPos1 + 1 + i]; + } + szAuth[iLenAuth] = '\0'; + + int iLenAccount = strlen(szAuthId) - iPos2 - 1; + if (iLenAccount <= 0 || iLenAccount >= sizeof(szAccount)) + return false; + + for (int i = 0; i < iLenAccount; i++) + { + szAccount[i] = szAuthId[iPos2 + 1 + i]; + } + szAccount[iLenAccount] = '\0'; + + if (!bIsInteger(szUniverse) || !bIsInteger(szAuth) || !bIsInteger(szAccount)) + return false; + + return true; +} + +/** + * @brief Checks if the given string represents an integer. + * + * This function iterates through each character of the input string and + * verifies if all characters are numeric. + * + * @param szString The string to be checked. + * @return True if the string represents an integer, false otherwise. + */ +bool bIsInteger(const char[] szString) +{ + int iLen = strlen(szString); + for (int i = 0; i < iLen; i++) + { + if (!IsCharNumeric(szString[i])) + return false; + } + return true; +} + +/** + * Check if the translation file exists + * + * @param szTranslation Translation name. + * @noreturn + */ +stock void vLoadTranslation(const char[] szTranslation) +{ + char szPath[PLATFORM_MAX_PATH], + szName[64]; + + Format(szName, sizeof(szName), "translations/%s.txt", szTranslation); + BuildPath(Path_SM, szPath, sizeof(szPath), szName); + if (!FileExists(szPath)) + SetFailState("Missing translation file %s.txt", szTranslation); + + LoadTranslations(szTranslation); +} \ No newline at end of file diff --git a/addons/sourcemod/scripting/include/caster_system.inc b/addons/sourcemod/scripting/include/caster_system.inc index e7e982f08..9887b1cf0 100644 --- a/addons/sourcemod/scripting/include/caster_system.inc +++ b/addons/sourcemod/scripting/include/caster_system.inc @@ -3,20 +3,69 @@ #endif #define _caster_system_included +enum eTypeID +{ + kClient = 0, + kAuth = 1, +} + +enum eTypeAction +{ + kGet = 0, + kSet = 1, + kRem = 2 +} + +/** + * @brief Add, checks or remove a user from the Casters list. + * + * @param eTypeID Defines how the client will be identified. + * @param eTypeAction What action will be taken. + * @param iClient Required only if eTypeID is kClient, otherwise set it to -1. + * @param szAuthId Required only if eTypeID is kAuth, otherwise it is not necessary to define it. + * @return True if the client or AuthID is a caster (for Get action), false otherwise. + */ +native bool bCaster(eTypeID eID, eTypeAction eAction, int iClient = -1, const char[] szAuthId = ""); + +/** + * @brief Add, checks or remove a user from the Casters whitelist. + * + * @param eTypeID Defines how the client will be identified. + * @param eTypeAction What action will be taken. + * @param iClient Required only if eTypeID is kClient, otherwise set it to -1. + * @param szAuthId Required only if eTypeID is kAuth, otherwise it is not necessary to define it. + * @return True if the action was successful, false otherwise. + */ +native bool bCasterWhitelist(eTypeID eID, eTypeAction eAction, int iClient = -1, const char[] szAuthId = ""); + +/** + * @brief Add, checks or remove a user from the spectator immunity list. + * + * @param eTypeID Defines how the client will be identified. + * @param eTypeAction What action will be taken. + * @param iClient Required only if eTypeID is kClient, otherwise set it to -1. + * @param szAuthId Required only if eTypeID is kAuth, otherwise it is not necessary to define it. + * @return True if the client has spectator immunity, false otherwise. + */ +native bool bKickSpecInmunity(eTypeID eID, eTypeAction eAction, int iClient = -1, const char[] szAuthId = ""); + /** - * If this in-game and fully connected client is a caster or not + * @brief Called when a client is added to the caster list. * - * @return True if this is a registered caster + * @param eTypeID Defines how the client will be identified. + * @param iClient It will be defined only if eTypeID is kClient. + * @param szAuthId It will be defined only if eTypeID is kAuth. */ -native bool IsClientCaster(int client); +forward void OnCaster(eTypeID eID, int iClient, const char[] szAuthId); /** - * If this Steam ID is a registered caster or not + * @brief Called when a client is removed to the caster list. * - * @param String containing the user's auth id - * @return True if this is a registered caster + * @param eTypeID Defines how the client will be identified. + * @param iClient It will be defined only if eTypeID is kClient. + * @param szAuthId It will be defined only if eTypeID is kAuth. */ -native bool IsIDCaster(const char[] AuthID); +forward void OffCaster(eTypeID eID, int iClient, const char[] szAuthId); public SharedPlugin __pl_caster_system = { @@ -32,7 +81,8 @@ public SharedPlugin __pl_caster_system = #if !defined REQUIRE_PLUGIN public void __pl_caster_system_SetNTVOptional() { - MarkNativeAsOptional("IsClientCaster"); - MarkNativeAsOptional("IsIDCaster"); + MarkNativeAsOptional("bCaster"); + MarkNativeAsOptional("bCasterWhitelist"); + MarkNativeAsOptional("bKickSpecInmunity"); } #endif \ No newline at end of file diff --git a/addons/sourcemod/scripting/specrates.sp b/addons/sourcemod/scripting/specrates.sp index 50b2e0e97..c91e9cd01 100644 --- a/addons/sourcemod/scripting/specrates.sp +++ b/addons/sourcemod/scripting/specrates.sp @@ -157,7 +157,7 @@ void AdjustRates(int client) g_Players[client].LastAdjusted = GetEngineTime(); L4DTeam team = L4D_GetClientTeam(client); - if (team == L4DTeam_Survivor || team == L4DTeam_Infected || (g_bCasterSystem && IsClientCaster(client))) + if (team == L4DTeam_Survivor || team == L4DTeam_Infected || (g_bCasterSystem && bCaster(kClient, kGet, client))) ResetRates(client); else if (team == L4DTeam_Spectator) { diff --git a/addons/sourcemod/translations/caster_system.phrases.txt b/addons/sourcemod/translations/caster_system.phrases.txt index becd60dfa..041c1983b 100644 --- a/addons/sourcemod/translations/caster_system.phrases.txt +++ b/addons/sourcemod/translations/caster_system.phrases.txt @@ -1,149 +1,296 @@ "Phrases" { -// The following uses bracket style color tags (see colors.inc) - "SelfCastNotAllowed" + "Prefix" { - "en" "{blue}[{default}Cast{blue}] {default}You are not allowed to register as a caster {green}on this server{default}." + "en" "[{olive}Caster{default}]" } - "SelfCast1" + "AllowAddons" { - "en" "{blue}[{default}Cast{blue}] {default}You have registered yourself as a caster." + "en" "Addons are now {blue}allowed {default}for casters." } - "SelfCast2" + "CasterEmpty" { - "en" "{blue}[{default}Cast{blue}] {default}Reconnect to make your Addons work." + "en" "There are no {red}casters registered{default}." } - "RegCasterTarget" + "CasterFound" { - "#format" "{1:N}" - "en" "{default}[{olive}!{default}] {blue}Admin {default}({olive}{1}{default}) has registered you as a caster" + "#format" "{1:s}" + "en" "{blue}'{1}'{default} is already registered as a caster" } - "Reconnect1" + "CasterNoFound" { - "en" "{blue}[{default}Reconnect{blue}] {default}You will be reconnected to the server.." + "#format" "{1:s}" + "en" "{red}'{1}'{default} is not registered as a caster" } - "Reconnect2" + "CasterPlay" { - "en" "{blue}[{default}Reconnect{blue}] {default}There's a black screen instead of a loading bar!" + "en" "Before playing, you must {red}remove your caster registration{default}" } - "UnregCasterTarget" + "CasterReconnect" { - "#format" "{1:N}" - "en" "{default}[{olive}!{default}] {default}You are unregistered as a caster by {blue}Admin {default}({olive}{1}{default})" + "en" "Reconnect to make your {green}Addons work{default}." } - - "KickSpecsAdmin" + + "CasterReg" + { + "#format" "{1:s}" + "en" "{blue}'{1}'{default} was registered as a caster" + } + + "CasterRegFrom" { "#format" "{1:N}" - "en" "[{green}!{default}] {blue}Spectators {default}are kicked by {blue}Admin {default}({olive}{1}{default})" + "en" "{blue}Admin{default} ({olive}{1}{default}) has registered you as a caster" } - - "KickSpecsVoteSpec" + + "CasterRegError" { - "en" "[{olive}Cast{default}] {blue}Spectators {default}are not allowed to call a vote for {green}kicking specs{default}." + "#format" "{1:s}" + "en" "Error registering caster ({olive}{1}{default})" } - "VoteInProgress" + "CasterRemove" { - "en" "[{olive}Cast{default}] There's {olive}a vote {green}in progress{default}." + "#format" "{1:s}" + "en" "{red}'{1}'{default} was removed from the casters list" } - - "VoteDelay" + + "CasterRemoveFrom" { - "#format" "{1:d}" - "en" "[{olive}Cast{default}] Wait for another {blue}{1}s {default}to call a vote." + "#format" "{1:N}" + "en" "{blue}Admin{default} ({olive}{1}{default}) has unregistered you as a caster" } - + + "CasterRemoveError" + { + "#format" "{1:s}" + "en" "Error removing caster ({olive}{1}{default})" + } + + "CasterReset" + { + "en" "{blue}Casters list{default} successfully reset" + } + "ForbidAddons" { - "en" "{blue}[{default}!{blue}] {default}Addons are now {green}forbidden {default}for casters." + "en" "Addons are now {red}forbidden {default}for casters." } - - "AllowAddons" + + "ListPrinted" { - "en" "{blue}[{default}!{blue}] {default}Addons are now {green}allowed {default}for casters." + "en" "List printed in the {green}console{default}" } - - "CasterCheck1" + + "MenuCastersList" { - "en" "{default}<{olive}Cast{default}> Unregister from casting first before playing." + "en" "List of Casters" } - - "CasterCheck2" + + "MenuPlayersList" { - "en" "{default}<{olive}Cast{default}> Use {green}!notcasting {default}/ {green}!uncast" + "en" "List of Players" } - -// The following are not allowed to use any color tag - "RegCasterReply" + "MenuWhitelistList" { - "#format" "{1:N}" - "en" "Registered {1} as a caster" + "en" "Whitelist" } - - "CasterSteamIDError" + + "PlayerNotFound" + { + "#format" "{1:s}" + "en" "{red}'{1}'{default} not found" + } + + "Reconnect" + { + "en" "You will be reconnected to the server, now {green}you will see a black screen instead of a loading bar{default}" + } + + "SQLCacheSuccess" + { + "en" "Database cache was {green}successfully{default} updated" + } + + "SQLDisabled" + { + "en" "SQL {red}disabled{default}." + } + + "SQLError" + { + "en" "SQL {red}error{default}" + } + + "SQLFound" + { + "#format" "{1:s}" + "en" "{blue}'{1}'{default} is already registered in the database" + } + + "SQLNoFound" + { + "#format" "{1:s}" + "en" "{red}'{1}'{default} is not registered in the database" + } + + "SQLNoConnect" + { + "en" "{red}Could not{default} connect to database." + } + + "SQLQueryError" + { + "en" "Database query {red}error{default}" + } + + "SQLReg" { - "en" "Couldn't find Steam ID. Check for typos and let the player get fully connected." + "#format" "{1:s}" + "en" "{blue}'{1}'{default} was registered in the database" } - "UnregCasterNonAdmin" + "SQLRegFrom" { - "en" "Only admins can remove other casters. Use sm_notcasting without arguments if you wish to remove yourself." + "#format" "{1:N}" + "en" "{blue}Admin{default} ({olive}{1}{default}) has registered you in the database" } - "UnregCasterSuccess" + "SQLRemoved" + { + "#format" "{1:s}" + "en" "{red}'{1}'{default} was removed from the database" + } + + "SQLRemovedFrom" { "#format" "{1:N}" - "en" "{1} is no longer a caster" + "en" "{blue}Admin{default} ({olive}{1}{default}) has removed you from the database" } - "CasterDBReset" + "SQLResetSuccess" { - "en" "[casters_database] Reset successfully" + "en" "Database was {green}successfully{default} reset" } - - "CasterDBAdd" + + "SQLTableCreated" + { + "en" "SQL table created successfully." + } + + "SelfRegCasterFound" + { + "en" "You are already {blue}registered{default} as a {blue}caster{default}." + } + + "SelfRegDisabled" + { + "en" "Self-registration is {red}disabled{default}." + } + + "SelfRegNoAdmin" + { + "en" "{red}Only admins{default} can register other players." + } + + "SelfRegSuccess" + { + "en" "You have {blue}registered{default} yourself as a {blue}caster{default}." + } + + "SelfRegWhitelistNotFound" + { + "en" "You cannot {green}self-register{default} as {red}you are not on the whitelist{default}." + } + + "AuthIdError" { "#format" "{1:s}" - "en" "[casters_database] Added '{1}'" + "en" "The steamid ({red}'{1}'{default}) is invalid." } - - "CasterDBRemove" + + "UnRegCasterNonAdmin" + { + "en" "Only {blue}admins{default} can remove other casters." + } + + "Use" + { + "en" "Use" + } + + "UseNoCast" + { + "en" "Use {green}!uncast{default}, to remove your registration" + } + + "WhitelistEmpty" + { + "en" "You cannot {green}self-register{default} as there are {red}no players on the whitelist{default}." + } + + "WhitelistFound" { "#format" "{1:s}" - "en" "[casters_database] Removed '{1}'" + "en" "{blue}'{1}'{default} is already on the whitelist" } - - "CasterDBFound" + + "WhitelistNoFound" { "#format" "{1:s}" - "en" "[casters_database] '{1}' already exists" + "en" "{red}'{1}'{default} is not on the whitelist" } - - "CasterDBError" + + "WhitelistReg" { - "en" "[casters_database] No args specified / empty buffer" + "#format" "{1:s}" + "en" "Whitelisted {blue}'{1}'{default}" } - - "KickSpecsVoteTitle" + + "WhitelistRegFrom" { - "en" "Kick Non-Admin & Non-Casting Spectators?" + "#format" "{1:N}" + "en" "{blue}Admin{default} ({olive}{1}{default}) has whitelisted you" + } + + "WhitelistRegError" + { + "#format" "{1:s}" + "en" "Error whitelisting ({olive}{1}{default})" + } + + "WhitelistRemove" + { + "#format" "{1:s}" + "en" "Removed {red}'{1}'{default} from the whitelist" + } + + "WhitelistRemoveFrom" + { + "#format" "{1:N}" + "en" "{blue}Admin{default} ({olive}{1}{default}) has removed you from the whitelist" } - "KickSpecsVoteSuccess" + "WhitelistRemoveError" { - "en" "Ciao Spectators!" + "#format" "{1:s}" + "en" "Error removing from whitelist ({olive}{1}{default})" } - "KickSpecsReason" + "WhitelistReset" + { + "en" "{blue}Whitelist{default} successfully reset" + } + + "NoTargetsToRemove" { - "en" "No Spectators, please!" + "en" "No players found" } } \ No newline at end of file diff --git a/addons/sourcemod/translations/chi/caster_system.phrases.txt b/addons/sourcemod/translations/chi/caster_system.phrases.txt deleted file mode 100644 index 05edd496d..000000000 --- a/addons/sourcemod/translations/chi/caster_system.phrases.txt +++ /dev/null @@ -1,148 +0,0 @@ -"Phrases" -{ -// The following uses bracket style color tags (see colors.inc) - "SelfCastNotAllowed" - { - "chi" "{blue}[{default}Cast{blue}] {green}该服务器{default}拒绝了你的解说认证" - } - - "SelfCast1" - { - "chi" "{blue}[{default}Cast{blue}] 你已经被认证成为了解说" - } - - "SelfCast2" - { - "chi" "{blue}[{default}Cast{blue}] 重连服务器以加载 MOD" - } - - "RegCasterTarget" - { - "#format" "{1:N}" - "chi" "{default}[{olive}!{default}] {blue}管理员 {default}({olive}{1}{default}) 认证了你为解说" - } - - "Reconnect1" - { - "chi" "{blue}[{default}Reconnect{blue}] 你将会被重连至服务器..." - } - - "Reconnect2" - { - "chi" "{blue}[{default}Reconnect{blue}] 期间会黑屏而没有加载条!" - } - - "UnregCasterTarget" - { - "#format" "{1:N}" - "chi" "{default}[{olive}!{default}] {blue}管理员 {default}({olive}{1}{default}) 解除了你的解说身份" - } - - "KickSpecsAdmin" - { - "#format" "{1:N}" - "chi" "[{green}!{default}] {blue}管理员 {default}({olive}{1}{default}) {default}踢出了{blue}所有旁观者" - } - - "KickSpecsVoteSpec" - { - "chi" "[{olive}Cast{default}] {blue}旁观 {default}不可以投票 {green}踢出旁观{default}" - } - - "VoteInProgress" - { - "chi" "[{olive}Cast{default}] 现在有{olive}投票{green}正在进行{default}" - } - - "VoteDelay" - { - "#format" "{1:d}" - "chi" "[{olive}Cast{default}] 请等待 {blue}{1}秒 {default}以发起下一轮投票" - } - - "ForbidAddons" - { - "chi" "{blue}[{default}!{blue}] {default}管理员{green}禁止了{default}解说使用 MOD" - } - - "AllowAddons" - { - "chi" "{blue}[{default}!{blue}] {default}管理员{green}开启了{default}解说使用 MOD" - } - - "CasterCheck1" - { - "chi" "{default}<{olive}Cast{default}> 请先解除解说身份" - } - - "CasterCheck2" - { - "chi" "{default}<{olive}Cast{default}> 命令为 {green}!notcasting {default}/ {green}!uncast" - } - -// The following are not allowed to use any color tag - "RegCasterReply" - { - "#format" "{1:N}" - "chi" "认证了 {1} 为解说" - } - - "CasterSteamIDError" - { - "chi" "Steam ID查询失败。 请检查拼写错误,等待玩家加载。" - } - - "UnregCasterNonAdmin" - { - "chi" "只有管理员可以撤销其他人的解说身份。 输入不带参数的 sm_notcasting 以解除解说身份。" - } - - "UnregCasterSuccess" - { - "#format" "{1:N}" - "chi" "{1} 已不再是解说。" - } - - "CasterDBReset" - { - "chi" "[casters_database] 重置成功" - } - - "CasterDBAdd" - { - "#format" "{1:s}" - "chi" "[casters_database] 添加了 '{1}'" - } - - "CasterDBRemove" - { - "#format" "{1:s}" - "chi" "[casters_database] 移除了 '{1}'" - } - - "CasterDBFound" - { - "#format" "{1:s}" - "chi" "[casters_database] '{1}' 已存在" - } - - "CasterDBError" - { - "chi" "[casters_database] 缺少参数 / 空字符串" - } - - "KickSpecsVoteTitle" - { - "chi" "踢出所有非管理员和解说的旁观?" - } - - "KickSpecsVoteSuccess" - { - "chi" "撒尤娜拉" - } - - "KickSpecsReason" - { - "chi" "本比赛不允许旁观" - } -} \ No newline at end of file diff --git a/addons/sourcemod/translations/es/caster_system.phrases.txt b/addons/sourcemod/translations/es/caster_system.phrases.txt new file mode 100644 index 000000000..e163e4bd6 --- /dev/null +++ b/addons/sourcemod/translations/es/caster_system.phrases.txt @@ -0,0 +1,296 @@ +"Phrases" +{ + "Prefix" + { + "es" "[{olive}Caster{default}]" + } + + "AllowAddons" + { + "es" "Los Addons ahora están {blue}permitidos {default}para los casters." + } + + "CasterEmpty" + { + "es" "No hay {red}casters registrados{default}." + } + + "CasterFound" + { + "#format" "{1:s}" + "es" "{blue}'{1}'{default} ya está registrado como caster" + } + + "CasterNoFound" + { + "#format" "{1:s}" + "es" "{red}'{1}'{default} no está registrado como caster" + } + + "CasterPlay" + { + "es" "Antes de jugar, debes {red}eliminar tu registro de caster{default}" + } + + "CasterReconnect" + { + "es" "Reconéctate para que tus {green}Addons funcionen{default}." + } + + "CasterReg" + { + "#format" "{1:s}" + "es" "{blue}'{1}'{default} fue registrado como caster" + } + + "CasterRegFrom" + { + "#format" "{1:N}" + "es" "{blue}Admin{default} ({olive}{1}{default}) te ha registrado como caster" + } + + "CasterRegError" + { + "#format" "{1:s}" + "es" "Error al registrar caster ({olive}{1}{default})" + } + + "CasterRemove" + { + "#format" "{1:s}" + "es" "{red}'{1}'{default} fue eliminado de la lista de casters" + } + + "CasterRemoveFrom" + { + "#format" "{1:N}" + "es" "{blue}Admin{default} ({olive}{1}{default}) te ha desregistrado como caster" + } + + "CasterRemoveError" + { + "#format" "{1:s}" + "es" "Error al eliminar caster ({olive}{1}{default})" + } + + "CasterReset" + { + "es" "Lista de {blue}casters{default} restablecida con éxito" + } + + "ForbidAddons" + { + "es" "Los Addons ahora están {red}prohibidos {default}para los casters." + } + + "ListPrinted" + { + "es" "Lista impresa en la {green}consola{default}" + } + + "MenuCastersList" + { + "es" "Lista de Casters" + } + + "MenuPlayersList" + { + "es" "Lista de Jugadores" + } + + "MenuWhitelistList" + { + "es" "Lista Blanca" + } + + "PlayerNotFound" + { + "#format" "{1:s}" + "es" "{red}'{1}'{default} no encontrado" + } + + "Reconnect" + { + "es" "Serás reconectado al servidor, ahora {green}verás una pantalla negra en lugar de una barra de carga{default}" + } + + "SQLCacheSuccess" + { + "es" "La caché de base de datos fue actualizada {green}exitosamente{default}" + } + + "SQLDisabled" + { + "es" "SQL {red}deshabilitado{default}." + } + + "SQLError" + { + "es" "{red}Error{default} en la consulta SQL" + } + + "SQLFound" + { + "#format" "{1:s}" + "es" "{blue}'{1}'{default} ya está registrado en la base de datos" + } + + "SQLNoFound" + { + "#format" "{1:s}" + "es" "{red}'{1}'{default} no está registrado en la base de datos" + } + + "SQLNoConnect" + { + "es" "{red}No se pudo{default} conectar a la base de datos." + } + + "SQLQueryError" + { + "es" "Error en la consulta a la base de datos" + } + + "SQLReg" + { + "#format" "{1:s}" + "es" "{blue}'{1}'{default} fue registrado en la base de datos" + } + + "SQLRegFrom" + { + "#format" "{1:N}" + "es" "{blue}Admin{default} ({olive}{1}{default}) te ha registrado en la base de datos" + } + + "SQLRemoved" + { + "#format" "{1:s}" + "es" "{red}'{1}'{default} fue eliminado de la base de datos" + } + + "SQLRemovedFrom" + { + "#format" "{1:N}" + "es" "{blue}Admin{default} ({olive}{1}{default}) te ha eliminado de la base de datos" + } + + "SQLResetSuccess" + { + "es" "La base de datos fue {green}restablecida{default} con éxito" + } + + "SQLTableCreated" + { + "es" "Tabla SQL creada exitosamente." + } + + "SelfRegCasterFound" + { + "es" "Ya estás {blue}registrado{default} como {blue}caster{default}." + } + + "SelfRegDisabled" + { + "es" "El auto-registro está {red}deshabilitado{default}." + } + + "SelfRegNoAdmin" + { + "es" "{red}Solo los admins{default} pueden registrar a otros jugadores." + } + + "SelfRegSuccess" + { + "es" "Te has {blue}registrado{default} como {blue}caster{default}." + } + + "SelfRegWhitelistNotFound" + { + "es" "No puedes {green}auto-registrarte{default} ya que {red}no estás en la lista blanca{default}." + } + + "AuthIdError" + { + "#format" "{1:s}" + "es" "El steamid ({red}'{1}'{default}) es inválido." + } + + "UnRegCasterNonAdmin" + { + "es" "Solo los {blue}admins{default} pueden eliminar a otros casters." + } + + "Use" + { + "es" "Usar" + } + + "UseNoCast" + { + "es" "Usa {green}!uncast{default}, para eliminar tu registro" + } + + "WhitelistEmpty" + { + "es" "No puedes {green}auto-registrarte{default} ya que {red}no hay jugadores en la lista blanca{default}." + } + + "WhitelistFound" + { + "#format" "{1:s}" + "es" "{blue}'{1}'{default} ya está en la lista blanca" + } + + "WhitelistNoFound" + { + "#format" "{1:s}" + "es" "{red}'{1}'{default} no está en la lista blanca" + } + + "WhitelistReg" + { + "#format" "{1:s}" + "es" "{blue}'{1}'{default} añadido a la lista blanca" + } + + "WhitelistRegFrom" + { + "#format" "{1:N}" + "es" "{blue}Admin{default} ({olive}{1}{default}) te ha añadido a la lista blanca" + } + + "WhitelistRegError" + { + "#format" "{1:s}" + "es" "Error al añadir a la lista blanca ({olive}{1}{default})" + } + + "WhitelistRemove" + { + "#format" "{1:s}" + "es" "{red}'{1}'{default} eliminado de la lista blanca" + } + + "WhitelistRemoveFrom" + { + "#format" "{1:N}" + "es" "{blue}Admin{default} ({olive}{1}{default}) te ha eliminado de la lista blanca" + } + + "WhitelistRemoveError" + { + "#format" "{1:s}" + "es" "Error al eliminar de la lista blanca ({olive}{1}{default})" + } + + "WhitelistReset" + { + "es" "{blue}Lista blanca{default} restablecida con éxito" + } + + "NoTargetsToRemove" + { + "es" "No se encontraron jugadores" + } +} \ No newline at end of file diff --git a/addons/sourcemod/translations/jp/caster_system.phrases.txt b/addons/sourcemod/translations/jp/caster_system.phrases.txt deleted file mode 100644 index 4395ec48b..000000000 --- a/addons/sourcemod/translations/jp/caster_system.phrases.txt +++ /dev/null @@ -1,149 +0,0 @@ -"Phrases" -{ -// The following uses bracket style color tags (see colors.inc) - "SelfCastNotAllowed" - { - "jp" "{blue}[{default}Cast{blue}] {default}あなたはこの{green}サーバー{default}では、キャスターに登録することは出来ません。" - } - - "SelfCast1" - { - "jp" "{blue}[{default}Cast{blue}] {default}あなたをキャスターに登録しました。" - } - - "SelfCast2" - { - "jp" "{blue}[{default}Cast{blue}] {default}アドオンを有効するには、サーバーの再接続が必要です。" - } - - "RegCasterTarget" - { - "#format" "{1:N}" - "jp" "{default}[{olive}!{default}] {blue}管理者{default}({olive}{1}{default}) があなたをキャスターに登録しました。" - } - - "Reconnect1" - { - "jp" "{blue}[{default}Reconnect{blue}] {default}サーバーへ再接続を行います.." - } - - "Reconnect2" - { - "jp" "{blue}[{default}Reconnect{blue}] {default}ローディングバーの代わりに黒い画面が表示されます!" - } - - "UnregCasterTarget" - { - "#format" "{1:N}" - "jp" "{default}[{olive}!{default}] {default}あなたは {blue}管理者{default}({olive}{1}{default}) にキャスターの登録が解除されました。" - } - - "KickSpecsAdmin" - { - "#format" "{1:N}" - "jp" "[{green}!{default}] {blue}観戦者{default}は {blue}管理者{default}({olive}{1}{default}) にキックされました。" - } - - "KickSpecsVoteSpec" - { - "jp" "[{olive}Cast{default}] {blue}観戦者{default}は {green}kicking specs{default} に投票することは出来ません。" - } - - "VoteInProgress" - { - "jp" "[{olive}Cast{default}] {olive}投票{green}行われています。{default}" - } - - "VoteDelay" - { - "#format" "{1:d}" - "jp" "[{olive}Cast{default}] 他の投票が行われており、残り {blue}{1}秒 {default}で投票が行えます。" - } - - "ForbidAddons" - { - "jp" "{blue}[{default}!{blue}] {default}キャスターはアドオンの使用が {green}禁止{default} されました。" - } - - "AllowAddons" - { - "jp" "{blue}[{default}!{blue}] {default}キャスターはアドオンの使用が {green}許可{default} されました。" - } - - "CasterCheck1" - { - "jp" "{default}<{olive}Cast{default}> ゲームをプレイするには、キャスターの登録を解除して下さい。" - } - - "CasterCheck2" - { - "jp" "{default}<{olive}Cast{default}> {green}!notcasting {default} / {green}!uncast {default}コマンドで解除" - } - - -// The following are not allowed to use any color tag - "RegCasterReply" - { - "#format" "{1:N}" - "jp" "{1} はキャスターとして登録済です。" - } - - "CasterSteamIDError" - { - "jp" "SteamIDが見つかりませんでした。 タイプミスが無いかどうか、プレイヤーがサーバーに接続されているかどうかを確認して下さい。" - } - - "UnregCasterNonAdmin" - { - "jp" "管理者のみが他のキャスターの解除が行えます。 あなたのキャスターの解除を行いたい場合は sm_notcasting を使用して下さい。" - } - - "UnregCasterSuccess" - { - "#format" "{1:N}" - "jp" "{1} はキャスターではなくなりました。" - } - - "CasterDBReset" - { - "jp" "[casters_database] リセットに成功しました。" - } - - "CasterDBAdd" - { - "#format" "{1:s}" - "jp" "[casters_database] '{1}' を追加しました。" - } - - "CasterDBRemove" - { - "#format" "{1:s}" - "jp" "[casters_database] '{1}' を削除しました。" - } - - "CasterDBFound" - { - "#format" "{1:s}" - "jp" "[casters_database] '{1}' は既に登録済です。" - } - - "CasterDBError" - { - "jp" "[casters_database] 引数が指定されていないか、バッファが空です。" - } - - "KickSpecsVoteTitle" - { - "jp" "観戦者全員(管理者・キャスターは除く)をキックしますか?" - } - - "KickSpecsVoteSuccess" - { - "jp" "観戦者全員をキックします..." - } - - "KickSpecsReason" - { - "jp" "観戦はお断りです!" - } -} \ No newline at end of file diff --git a/addons/sourcemod/translations/ko/caster_system.phrases.txt b/addons/sourcemod/translations/ko/caster_system.phrases.txt deleted file mode 100644 index d71f5a05d..000000000 --- a/addons/sourcemod/translations/ko/caster_system.phrases.txt +++ /dev/null @@ -1,149 +0,0 @@ -"Phrases" -{ -// The following uses bracket style color tags (see colors.inc) - "SelfCastNotAllowed" - { - "ko" "{blue}[{default}Cast{blue}] {default}당신은 {green}이 서버에{default} 캐스터 등록이 허가되지 않았습니다." - } - - "SelfCast1" - { - "ko" "{blue}[{default}Cast{blue}] {default}캐스터 등록이 완료되었습니다." - } - - "SelfCast2" - { - "ko" "{blue}[{default}Cast{blue}] {default}애드온을 활성화 하려면 재접속하십시오." - } - - "RegCasterTarget" - { - "#format" "{1:N}" - "ko" "{default}[{olive}!{default}] {blue}관리자 {default}({olive}{1}{default}) 가 당신을 캐스터로 등록하였습니다." - } - - "Reconnect1" - { - "ko" "{blue}[{default}Reconnect{blue}] {default}당신은 서버에 재접속 될 것 입니다.." - } - - "Reconnect2" - { - "ko" "{blue}[{default}Reconnect{blue}] {default}로딩화면 대신에 검은화면이 나옵니다!" - } - - "UnregCasterTarget" - { - "#format" "{1:N}" - "ko" "{default}[{olive}!{default}] {default}당신은 {blue}관리자 {default}({olive}{1}{default})에 의해 캐스터 등록이 해제되었습니다." - } - - "KickSpecsAdmin" - { - "#format" "{1:N}" - "ko" "[{green}!{default}] {blue}관리자 {default}({olive}{1}{default})에 의해{blue}관전자가 {default}추방되었습니다." - } - - "KickSpecsVoteSpec" - { - "ko" "[{olive}Cast{default}] {blue}관전자는 {green}관전자 추방 투표를 {default}할 수 없습니다." - } - - "VoteInProgress" - { - "ko" "[{olive}Cast{default}] {olive}투표가 {green}진행중{default} 입니다." - } - - "VoteDelay" - { - "#format" "{1:d}" - "ko" "[{olive}Cast{default}]{blue}{1}초 {default}후 투표를 시작할 수 있습니다." - } - - "ForbidAddons" - { - "ko" "{blue}[{default}!{blue}] 캐스터에 대한 에드온이 {green}금지됩니다{default}." - } - - "AllowAddons" - { - "ko" "{blue}[{default}!{blue}] 이제 캐스터에 대한 에드온이 {green}허용됩니다{default}." - } - - "CasterCheck1" - { - "ko" "{default}<{olive}Cast{default}> 캐스터는 플레이 하기 전에 등록을 취소해야됩니다." - } - - "CasterCheck2" - { - "ko" "{default}<{olive}Cast{default}> 사용 !notcasting / !uncast" - } - - -// The following are not allowed to use any color tag - "RegCasterReply" - { - "#format" "{1:N}" - "ko" "{1} 이 캐스터로 등록됨" - } - - "CasterSteamIDError" - { - "ko" "Steam ID를 찾지 못함. 오탈자 확인과 플레이어가 완전히 연결되게 하십시오." - } - - "UnregCasterNonAdmin" - { - "ko" "관리자만 다른 캐스터를 삭제할 수 있습니다. sm_notcasting 를 사용하여 스스로 캐스터 등록을 해제할 수 있습니다." - } - - "UnregCasterSuccess" - { - "#format" "{1:N}" - "ko" "{1} 은 더 이상 캐스터가 아닙니다." - } - - "CasterDBReset" - { - "ko" "[casters_database] 초기화 성공" - } - - "CasterDBAdd" - { - "#format" "{1:s}" - "ko" "[casters_database] '{1}' 추가됨" - } - - "CasterDBRemove" - { - "#format" "{1:s}" - "ko" "[casters_database] '{1}' 삭제됨" - } - - "CasterDBFound" - { - "#format" "{1:s}" - "ko" "[casters_database] '{1}' 이미 존재함" - } - - "CasterDBError" - { - "ko" "[casters_database] args가 명시되지 않음 / 비어있는 버퍼" - } - - "KickSpecsVoteTitle" - { - "ko" "관리자가 아니고 캐스터가 아닌 관전자를 추방하시겠습니까?" - } - - "KickSpecsVoteSuccess" - { - "ko" "잘가 관전자들!" - } - - "KickSpecsReason" - { - "ko" "관전자를 원하지 않습니다." - } -} \ No newline at end of file From ce331862ab4278e0b567a2910c68efa7cddef226 Mon Sep 17 00:00:00 2001 From: lechuga Date: Sat, 22 Mar 2025 14:31:31 -0300 Subject: [PATCH 2/8] Fixes error handling when obtaining AuthId and adjusts the character search in the caster system. --- .../plugins/optional/caster_system.smx | Bin 30615 -> 30588 bytes addons/sourcemod/scripting/caster_system.sp | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/sourcemod/plugins/optional/caster_system.smx b/addons/sourcemod/plugins/optional/caster_system.smx index 03f4968cb7e3673096251a7422b6450b2f80dcef..0daf6a6101eb0a8ef8795d813971f843935220cf 100644 GIT binary patch literal 30588 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

ikPz!y5zF@(Ha@`G|;)_Jycilt^eH%j)W`35EO- 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 biOuH-1rt3(x<5%Q>WzinS3m;?g7g0Ya_n46 diff --git a/addons/sourcemod/scripting/caster_system.sp b/addons/sourcemod/scripting/caster_system.sp index cf6b39ac1..9f7e4165b 100644 --- a/addons/sourcemod/scripting/caster_system.sp +++ b/addons/sourcemod/scripting/caster_system.sp @@ -703,7 +703,7 @@ public int iRegMenuHandler(Menu hMenu, MenuAction eAction, int iClient, int iIte if (!GetClientAuthId(iTarget, AuthId_Steam2, szAuthId, sizeof(szAuthId))) { CReplyToCommand(iClient, "%t %t", "Prefix", "AuthIdError", szAuthId); - return Plugin_Handled; + return 0; } vRegister(iClient, iTarget, szAuthId, szName, eList, kClient, SM_REPLY_TO_CHAT); @@ -1082,7 +1082,7 @@ public int iMenuRemoveHandler(Menu hMenu, MenuAction eAction, int iClient, int i if (!GetClientAuthId(iTarget, AuthId_Steam2, szAuthId, sizeof(szAuthId))) { CReplyToCommand(iClient, "%t %t", "Prefix", "AuthIdError", szAuthId); - return Plugin_Handled; + return 0; } vRemove(iClient, iTarget, szAuthId, szName, eList, kClient, SM_REPLY_TO_CHAT); @@ -1930,7 +1930,7 @@ bool bIsSteamId(const char[] szAuthId) if (iPos1 == NO_INDEX) return false; - int iPos2 = FindCharInString(szAuthId, ':', iPos1 + 1); + int iPos2 = FindCharInString(szAuthId, ':', view_as(iPos1 + 1)); if (iPos2 == NO_INDEX) return false; From 82d09e75e67970d712359874e40a3088b0a3b4f8 Mon Sep 17 00:00:00 2001 From: lechuga Date: Sat, 22 Mar 2025 14:47:07 -0300 Subject: [PATCH 3/8] fix --- addons/sourcemod/plugins/optional/readyup.smx | Bin 31625 -> 32027 bytes .../sourcemod/scripting/caster_system_test.sp | 588 +++++++++--------- addons/sourcemod/scripting/readyup/panel.inc | 2 +- 3 files changed, 293 insertions(+), 297 deletions(-) diff --git a/addons/sourcemod/plugins/optional/readyup.smx b/addons/sourcemod/plugins/optional/readyup.smx index b75e89d2354a15f31f584292a77a92429583b159..946148c0d80f55cc176f3f24ffa9b78a0f29ff15 100644 GIT binary patch literal 32027 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

dE1$XyeZ44AD`XihtM^$CoZ$_&U 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 JOCIk?_&=rARL=ka diff --git a/addons/sourcemod/scripting/caster_system_test.sp b/addons/sourcemod/scripting/caster_system_test.sp index 9a6c74c26..bfcce750c 100644 --- a/addons/sourcemod/scripting/caster_system_test.sp +++ b/addons/sourcemod/scripting/caster_system_test.sp @@ -8,36 +8,34 @@ #include #define REQUIRE_PLUGIN -#define STEAMID2_LENGTH 32 -#define PREFIX_TEST "[{olive}Test{default}]" +#define STEAMID2_LENGTH 32 +#define PREFIX_TEST "[{olive}Test{default}]" bool - g_bLateload, - g_bCasterSystem; - + g_bLateload, + g_bCasterSystem; enum eTypeList { kCaster = 0, - kWhite = 1, - kSQL = 2 + kWhite = 1, + kSQL = 2 } enum L4DTeam { - L4DTeam_Unassigned = 0, - L4DTeam_Spectator = 1, - L4DTeam_Survivor = 2, - L4DTeam_Infected = 3 + L4DTeam_Unassigned = 0, + L4DTeam_Spectator = 1, + L4DTeam_Survivor = 2, + L4DTeam_Infected = 3 } -public Plugin g_myInfo = -{ - name = "L4D2 Caster System Test", - author = "lechuga", - description = "Testing native and forward", - version = "1.0", - url = "https://github.com/SirPlease/L4D2-Competitive-Rework" +public Plugin g_myInfo = { + name = "L4D2 Caster System Test", + author = "lechuga", + description = "Testing native and forward", + version = "1.0", + url = "https://github.com/SirPlease/L4D2-Competitive-Rework" }; public APLRes AskPluginLoad2(Handle hMyself, bool bLate, char[] sError, int iErr_max) @@ -68,7 +66,7 @@ public void OnPluginStart() vLoadTranslation("common.phrases"); vLoadTranslation("caster_system.phrases"); - RegConsoleCmd("sm_tcaster", aTcasterRegCmd, "Registers a player to the caster list"); + RegConsoleCmd("sm_tcaster", aTcasterRegCmd, "Registers a player to the caster list"); RegConsoleCmd("sm_tcaster_rm", aTcasterRemoveCmd, "Removes a player from the caster list"); RegConsoleCmd("sm_tcaster_wl", aTwhitelistRegCmd, "Adds a player to the whitelist"); @@ -76,19 +74,19 @@ public void OnPluginStart() if (!g_bLateload) return; - + g_bCasterSystem = LibraryExists("caster_system"); } Action aTcasterRegCmd(int iClient, int iArgs) { - if (!g_bCasterSystem) - { - CPrintToChatAll("%s {red}Caster System{default} is not loaded", PREFIX_TEST); - return Plugin_Handled; - } + if (!g_bCasterSystem) + { + CPrintToChatAll("%s {red}Caster System{default} is not loaded", PREFIX_TEST); + return Plugin_Handled; + } - ReplySource eRsCmd = GetCmdReplySource(); + ReplySource eRsCmd = GetCmdReplySource(); if (iArgs == 0) { if (eRsCmd == SM_REPLY_TO_CHAT && iClient != SERVER_INDEX) @@ -98,26 +96,26 @@ Action aTcasterRegCmd(int iClient, int iArgs) return Plugin_Handled; } - char szArguments[64]; - GetCmdArgString(szArguments, sizeof(szArguments)); + char szArguments[64]; + GetCmdArgString(szArguments, sizeof(szArguments)); - char szArg[STEAMID2_LENGTH]; - BreakString(szArguments, szArg, sizeof(szArg)); + char szArg[STEAMID2_LENGTH]; + BreakString(szArguments, szArg, sizeof(szArg)); - vProcessReg(iClient, szArg, kCaster); + vProcessReg(iClient, szArg, kCaster); - return Plugin_Handled; + return Plugin_Handled; } Action aTwhitelistRegCmd(int iClient, int iArgs) { - if (!g_bCasterSystem) - { - CPrintToChatAll("%s {red}Caster System{default} is not loaded", PREFIX_TEST); - return Plugin_Handled; - } + if (!g_bCasterSystem) + { + CPrintToChatAll("%s {red}Caster System{default} is not loaded", PREFIX_TEST); + return Plugin_Handled; + } - ReplySource eRsCmd = GetCmdReplySource(); + ReplySource eRsCmd = GetCmdReplySource(); if (iArgs == 0) { if (eRsCmd == SM_REPLY_TO_CHAT && iClient != SERVER_INDEX) @@ -127,15 +125,15 @@ Action aTwhitelistRegCmd(int iClient, int iArgs) return Plugin_Handled; } - char szArguments[64]; - GetCmdArgString(szArguments, sizeof(szArguments)); + char szArguments[64]; + GetCmdArgString(szArguments, sizeof(szArguments)); - char szArg[STEAMID2_LENGTH]; - BreakString(szArguments, szArg, sizeof(szArg)); + char szArg[STEAMID2_LENGTH]; + BreakString(szArguments, szArg, sizeof(szArg)); - vProcessReg(iClient, szArg, kWhite); + vProcessReg(iClient, szArg, kWhite); - return Plugin_Handled; + return Plugin_Handled; } /** @@ -151,34 +149,34 @@ Action aTwhitelistRegCmd(int iClient, int iArgs) */ void vProcessReg(int iClient, const char[] szArg, eTypeList eList) { - if (bIsSteamId(szArg)) - { - vRegister(iClient, NO_INDEX, szArg, szArg, eList, kAuth); - return; - } - - int iTarget = FindTarget(iClient, szArg, true, false); - if (iTarget == NO_INDEX) - return; - - char szAuthId[STEAMID2_LENGTH]; - if (!GetClientAuthId(iTarget, AuthId_Steam2, szAuthId, sizeof(szAuthId))) - { - CReplyToCommand(iClient, "%t %t", "Prefix", "AuthIdError", szAuthId); - return; - } - - char szName[16]; - GetClientName(iTarget, szName, sizeof(szName)); - vRegister(iClient, iTarget, szAuthId, szName, eList, kClient); + if (bIsSteamId(szArg)) + { + vRegister(iClient, NO_INDEX, szArg, szArg, eList, kAuth); + return; + } + + int iTarget = FindTarget(iClient, szArg, true, false); + if (iTarget == NO_INDEX) + return; + + char szAuthId[STEAMID2_LENGTH]; + if (!GetClientAuthId(iTarget, AuthId_Steam2, szAuthId, sizeof(szAuthId))) + { + CReplyToCommand(iClient, "%t %t", "Prefix", "AuthIdError", szAuthId); + return; + } + + char szName[16]; + GetClientName(iTarget, szName, sizeof(szName)); + vRegister(iClient, iTarget, szAuthId, szName, eList, kClient); } void vDisplayRegMenu(int iClient, eTypeList eList) { - Menu hMenu; - hMenu = new Menu(iRegMenuHandler); + Menu hMenu; + hMenu = new Menu(iRegMenuHandler); char szTitle[100]; - Format(szTitle, sizeof(szTitle), "%t", "MenuPlayersList"); + Format(szTitle, sizeof(szTitle), "%t", "MenuPlayersList"); hMenu.SetTitle(szTitle); vListTargets(hMenu, eList); @@ -201,78 +199,78 @@ void vDisplayRegMenu(int iClient, eTypeList eList) */ void vListTargets(Menu hMenu, eTypeList eList) { - char szName[64], szBuffer[16], szAuthId[STEAMID2_LENGTH]; - int iUserId; + char szName[64], szBuffer[16], szAuthId[STEAMID2_LENGTH]; + int iUserId; - for (int i = 1; i <= MaxClients; i++) - { - if (!IsClientConnected(i) || IsFakeClient(i)) - continue; + for (int i = 1; i <= MaxClients; i++) + { + if (!IsClientConnected(i) || IsFakeClient(i)) + continue; - if (!GetClientName(i, szName, sizeof(szName))) - continue; + if (!GetClientName(i, szName, sizeof(szName))) + continue; - if (!GetClientAuthId(i, AuthId_Steam2, szAuthId, sizeof(szAuthId))) - continue; + if (!GetClientAuthId(i, AuthId_Steam2, szAuthId, sizeof(szAuthId))) + continue; - // Construct an identifier and add the eTypeList to it - iUserId = GetClientUserId(i); - Format(szBuffer, sizeof(szBuffer), "%d:%d", iUserId, view_as(eList)); + // Construct an identifier and add the eTypeList to it + iUserId = GetClientUserId(i); + Format(szBuffer, sizeof(szBuffer), "%d:%d", iUserId, view_as(eList)); - bool bIsCaster = (eList == kCaster) ? bCaster(kClient, kGet, i, szAuthId) : bCasterWhitelist(kClient, kGet, i, szAuthId); - hMenu.AddItem(szBuffer, szName, bIsCaster ? ITEMDRAW_DISABLED : ITEMDRAW_DEFAULT); - } + bool bIsCaster = (eList == kCaster) ? bCaster(kClient, kGet, i, szAuthId) : bCasterWhitelist(kClient, kGet, i, szAuthId); + hMenu.AddItem(szBuffer, szName, bIsCaster ? ITEMDRAW_DISABLED : ITEMDRAW_DEFAULT); + } } public int iRegMenuHandler(Menu hMenu, MenuAction eAction, int iClient, int iItem) { - switch (eAction) - { - case MenuAction_Select: - { - char szInfo[32], szName[32]; - int iUserId, iTarget; - - hMenu.GetItem(iItem, szInfo, sizeof(szInfo), _, szName, sizeof(szName)); - - char szPart1[16], szPart2[16]; - int iIndex; - - iIndex = SplitString(szInfo, ":", szPart1, sizeof(szPart1)); - if (iIndex != -1) - SplitString(szInfo[iIndex], ":", szPart2, sizeof(szPart2)); - - int iPart1 = StringToInt(szPart1); - int iPart2 = StringToInt(szPart2); - - iUserId = iPart1; - eTypeList eList = view_as(iPart2); - - if ((iTarget = GetClientOfUserId(iUserId)) == SERVER_INDEX) - CPrintToChat(iClient, "%t %t", "Prefix", "Player no longer available"); - else if (!CanUserTarget(iClient, iTarget)) - CPrintToChat(iClient, "%t %t", "Prefix", "Unable to target"); - else - { - char szAuthId[STEAMID2_LENGTH]; - if (!GetClientAuthId(iTarget, AuthId_Steam2, szAuthId, sizeof(szAuthId))) - { - CReplyToCommand(iClient, "%t %t", "Prefix", "AuthIdError", szAuthId); - return Plugin_Handled; - } - - char szTargetName[16]; - GetClientName(iTarget, szTargetName, sizeof(szTargetName)); - - vRegister(iClient, iTarget, szAuthId, szTargetName, eList, kClient); - } - } - case MenuAction_End: - { - delete hMenu; - } - } - return 0; + switch (eAction) + { + case MenuAction_Select: + { + char szInfo[32], szName[32]; + int iUserId, iTarget; + + hMenu.GetItem(iItem, szInfo, sizeof(szInfo), _, szName, sizeof(szName)); + + char szPart1[16], szPart2[16]; + int iIndex; + + iIndex = SplitString(szInfo, ":", szPart1, sizeof(szPart1)); + if (iIndex != -1) + SplitString(szInfo[iIndex], ":", szPart2, sizeof(szPart2)); + + int iPart1 = StringToInt(szPart1); + int iPart2 = StringToInt(szPart2); + + iUserId = iPart1; + eTypeList eList = view_as(iPart2); + + if ((iTarget = GetClientOfUserId(iUserId)) == SERVER_INDEX) + CPrintToChat(iClient, "%t %t", "Prefix", "Player no longer available"); + else if (!CanUserTarget(iClient, iTarget)) + CPrintToChat(iClient, "%t %t", "Prefix", "Unable to target"); + else + { + char szAuthId[STEAMID2_LENGTH]; + if (!GetClientAuthId(iTarget, AuthId_Steam2, szAuthId, sizeof(szAuthId))) + { + CReplyToCommand(iClient, "%t %t", "Prefix", "AuthIdError", szAuthId); + return 0; + } + + char szTargetName[16]; + GetClientName(iTarget, szTargetName, sizeof(szTargetName)); + + vRegister(iClient, iTarget, szAuthId, szTargetName, eList, kClient); + } + } + case MenuAction_End: + { + delete hMenu; + } + } + return 0; } /** @@ -287,35 +285,35 @@ public int iRegMenuHandler(Menu hMenu, MenuAction eAction, int iClient, int iIte */ void vRegister(int iClient, int iTarget, const char[] szAuthId, const char[] szDisplayName, eTypeList eList, eTypeID eId) { - bool bIndex = (eId == kClient); - bool bFound = false; - - switch (eList) - { - case kCaster: - bFound = bIndex ? bCaster(eId, kGet, iTarget, szAuthId) : bCaster(eId, kGet, NO_INDEX, szAuthId); - case kWhite: - bFound = bIndex ? bCasterWhitelist(eId, kGet, iTarget, szAuthId) : bCasterWhitelist(eId, kGet, NO_INDEX, szAuthId); - } - - if (bFound) - { - CReplyToCommand(iClient, "%t %t", "Prefix", eList == kCaster ? "CasterFound" : "WhitelistFound", szDisplayName); - return; - } - - switch (eList) - { - case kCaster: - bCaster(eId, kSet, iTarget, szAuthId); - case kWhite: - bCasterWhitelist(eId, kSet, iTarget, szAuthId); - } + bool bIndex = (eId == kClient); + bool bFound = false; + + switch (eList) + { + case kCaster: + bFound = bIndex ? bCaster(eId, kGet, iTarget, szAuthId) : bCaster(eId, kGet, NO_INDEX, szAuthId); + case kWhite: + bFound = bIndex ? bCasterWhitelist(eId, kGet, iTarget, szAuthId) : bCasterWhitelist(eId, kGet, NO_INDEX, szAuthId); + } + + if (bFound) + { + CReplyToCommand(iClient, "%t %t", "Prefix", eList == kCaster ? "CasterFound" : "WhitelistFound", szDisplayName); + return; + } + + switch (eList) + { + case kCaster: + bCaster(eId, kSet, iTarget, szAuthId); + case kWhite: + bCasterWhitelist(eId, kSet, iTarget, szAuthId); + } } Action aTcasterRemoveCmd(int iClient, int iArgs) { - ReplySource eRsCmd = GetCmdReplySource(); + ReplySource eRsCmd = GetCmdReplySource(); if (iArgs == 0) { if (eRsCmd == SM_REPLY_TO_CHAT && iClient != SERVER_INDEX) @@ -325,19 +323,19 @@ Action aTcasterRemoveCmd(int iClient, int iArgs) return Plugin_Handled; } - char szArguments[64]; - GetCmdArgString(szArguments, sizeof(szArguments)); + char szArguments[64]; + GetCmdArgString(szArguments, sizeof(szArguments)); - char szArg[STEAMID2_LENGTH]; - BreakString(szArguments, szArg, sizeof(szArg)); + char szArg[STEAMID2_LENGTH]; + BreakString(szArguments, szArg, sizeof(szArg)); - vProcessRemove(iClient, szArg, kCaster); - return Plugin_Handled; + vProcessRemove(iClient, szArg, kCaster); + return Plugin_Handled; } Action aTwhitelistRemoveCmd(int iClient, int iArgs) { - ReplySource eRsCmd = GetCmdReplySource(); + ReplySource eRsCmd = GetCmdReplySource(); if (iArgs == 0) { if (eRsCmd == SM_REPLY_TO_CHAT && iClient != SERVER_INDEX) @@ -347,14 +345,14 @@ Action aTwhitelistRemoveCmd(int iClient, int iArgs) return Plugin_Handled; } - char szArguments[64]; - GetCmdArgString(szArguments, sizeof(szArguments)); + char szArguments[64]; + GetCmdArgString(szArguments, sizeof(szArguments)); - char szArg[STEAMID2_LENGTH]; - BreakString(szArguments, szArg, sizeof(szArg)); + char szArg[STEAMID2_LENGTH]; + BreakString(szArguments, szArg, sizeof(szArg)); - vProcessRemove(iClient, szArg, kWhite); - return Plugin_Handled; + vProcessRemove(iClient, szArg, kWhite); + return Plugin_Handled; } /** @@ -371,26 +369,26 @@ Action aTwhitelistRemoveCmd(int iClient, int iArgs) */ void vProcessRemove(int iClient, const char[] szArg, eTypeList eList) { - if (bIsSteamId(szArg)) - { - vRemove(iClient, NO_INDEX, szArg, szArg, eList, kAuth); - return; - } - - int iTarget = FindTarget(iClient, szArg, true, false); - if (iTarget == NO_INDEX) - return; - - char szAuthId[STEAMID2_LENGTH]; - if (!GetClientAuthId(iTarget, AuthId_Steam2, szAuthId, sizeof(szAuthId))) - { - CReplyToCommand(iClient, "%t %t", "Prefix", "AuthIdError", szAuthId); - return; - } - - char szName[16]; - GetClientName(iTarget, szName, sizeof(szName)); - vRemove(iClient, iTarget, szAuthId, szName, eList, kClient); + if (bIsSteamId(szArg)) + { + vRemove(iClient, NO_INDEX, szArg, szArg, eList, kAuth); + return; + } + + int iTarget = FindTarget(iClient, szArg, true, false); + if (iTarget == NO_INDEX) + return; + + char szAuthId[STEAMID2_LENGTH]; + if (!GetClientAuthId(iTarget, AuthId_Steam2, szAuthId, sizeof(szAuthId))) + { + CReplyToCommand(iClient, "%t %t", "Prefix", "AuthIdError", szAuthId); + return; + } + + char szName[16]; + GetClientName(iTarget, szName, sizeof(szName)); + vRemove(iClient, iTarget, szAuthId, szName, eList, kClient); } /** @@ -409,42 +407,42 @@ void vProcessRemove(int iClient, const char[] szArg, eTypeList eList) */ void vRemove(int iClient, int iTarget, const char[] szAuthId, const char[] szDisplayName, eTypeList eList, eTypeID eId) { - bool bIndex = (iTarget > SERVER_INDEX); - bool bFound = false; - - switch (eList) - { - case kCaster: - bFound = bIndex ? bCaster(eId, kGet, iTarget, szAuthId) : bCaster(eId, kGet, NO_INDEX, szAuthId); - case kWhite: - bFound = bIndex ? bCasterWhitelist(eId, kGet, iTarget, szAuthId) : bCasterWhitelist(eId, kGet, NO_INDEX, szAuthId); - } - - if (!bFound) - { - CReplyToCommand(iClient, "%t %t", "Prefix", eList == kCaster ? "CasterNoFound" : "WhitelistNoFound", szDisplayName); - return; - } - - switch (eList) - { - case kCaster: - bCaster(eId, kRem, iTarget, szAuthId); - case kWhite: - bCasterWhitelist(eId, kRem, iTarget, szAuthId); - } + bool bIndex = (iTarget > SERVER_INDEX); + bool bFound = false; + + switch (eList) + { + case kCaster: + bFound = bIndex ? bCaster(eId, kGet, iTarget, szAuthId) : bCaster(eId, kGet, NO_INDEX, szAuthId); + case kWhite: + bFound = bIndex ? bCasterWhitelist(eId, kGet, iTarget, szAuthId) : bCasterWhitelist(eId, kGet, NO_INDEX, szAuthId); + } + + if (!bFound) + { + CReplyToCommand(iClient, "%t %t", "Prefix", eList == kCaster ? "CasterNoFound" : "WhitelistNoFound", szDisplayName); + return; + } + + switch (eList) + { + case kCaster: + bCaster(eId, kRem, iTarget, szAuthId); + case kWhite: + bCasterWhitelist(eId, kRem, iTarget, szAuthId); + } } void vDisplayRemoveMenu(int iClient, eTypeList eList) { char szTitle[100]; - switch (eList) - { - case kCaster: - Format(szTitle, sizeof(szTitle), "%T", "MenuCastersList", iClient); - case kWhite: - Format(szTitle, sizeof(szTitle), "%T", "MenuWhitelistList", iClient); - } + switch (eList) + { + case kCaster: + Format(szTitle, sizeof(szTitle), "%T", "MenuCastersList", iClient); + case kWhite: + Format(szTitle, sizeof(szTitle), "%T", "MenuWhitelistList", iClient); + } Menu hMenu = new Menu(iMenuRemove); hMenu.SetTitle(szTitle); @@ -468,11 +466,11 @@ void vDisplayRemoveMenu(int iClient, eTypeList eList) void vRemoveTargets(Menu hMenu, eTypeList eList, int iClient) { char - szName[64], + szName[64], szInfo[16], szAuthId[STEAMID2_LENGTH]; - bool + bool bFound; int @@ -489,7 +487,7 @@ void vRemoveTargets(Menu hMenu, eTypeList eList, int iClient) if (!GetClientAuthId(i, AuthId_Steam2, szAuthId, sizeof(szAuthId))) continue; - Format(szInfo, sizeof(szInfo), "%d:%d", GetClientUserId(i), view_as(eList)); + Format(szInfo, sizeof(szInfo), "%d:%d", GetClientUserId(i), view_as(eList)); switch (eList) { @@ -499,102 +497,100 @@ void vRemoveTargets(Menu hMenu, eTypeList eList, int iClient) bFound = bCasterWhitelist(kClient, kGet, i, szAuthId); } - if (bFound) + if (bFound) { - hMenu.AddItem(szInfo, szName); + hMenu.AddItem(szInfo, szName); iTargets++; } } if (iTargets == 0) { - char szMsj[64]; - Format(szMsj, sizeof(szMsj), "%T", "NoTargetsToRemove", iClient); + char szMsj[64]; + Format(szMsj, sizeof(szMsj), "%T", "NoTargetsToRemove", iClient); hMenu.AddItem("", szMsj, ITEMDRAW_DISABLED); } } public int iMenuRemove(Menu hMenu, MenuAction eAction, int iClient, int iItem) { - if (eAction == MenuAction_Select) - { - char - szInfo[32], - szName[32], - szPart1[16], - szPart2[16]; - - int - iIndex, - iUserId, - iTarget; - - eTypeList - eList; - - hMenu.GetItem(iItem, szInfo, sizeof(szInfo), _, szName, sizeof(szName)); - - iIndex = SplitString(szInfo, ":", szPart1, sizeof(szPart1)); - SplitString(szInfo[iIndex], ":", szPart2, sizeof(szPart2)); - - iUserId = StringToInt(szPart1); - eList = view_as(StringToInt(szPart2)); - - if ((iTarget = GetClientOfUserId(iUserId)) == SERVER_INDEX) - CPrintToChat(iClient, "%t %t", "Prefix", "Player no longer available"); - else - { - char szAuthId[STEAMID2_LENGTH]; - if (!GetClientAuthId(iTarget, AuthId_Steam2, szAuthId, sizeof(szAuthId))) - { - CReplyToCommand(iClient, "%t %t", "Prefix", "AuthIdError", szAuthId); - return Plugin_Handled; - } - - vRemove(iClient, iTarget, szAuthId, szName, eList, kClient); - } - } - else if (eAction == MenuAction_End) - delete hMenu; - return 0; + if (eAction == MenuAction_Select) + { + char + szInfo[32], + szName[32], + szPart1[16], + szPart2[16]; + + int + iIndex, + iUserId, + iTarget; + + eTypeList + eList; + + hMenu.GetItem(iItem, szInfo, sizeof(szInfo), _, szName, sizeof(szName)); + + iIndex = SplitString(szInfo, ":", szPart1, sizeof(szPart1)); + SplitString(szInfo[iIndex], ":", szPart2, sizeof(szPart2)); + + iUserId = StringToInt(szPart1); + eList = view_as(StringToInt(szPart2)); + + if ((iTarget = GetClientOfUserId(iUserId)) == SERVER_INDEX) + CPrintToChat(iClient, "%t %t", "Prefix", "Player no longer available"); + else + { + char szAuthId[STEAMID2_LENGTH]; + if (!GetClientAuthId(iTarget, AuthId_Steam2, szAuthId, sizeof(szAuthId))) + { + CReplyToCommand(iClient, "%t %t", "Prefix", "AuthIdError", szAuthId); + return 0; + } + + vRemove(iClient, iTarget, szAuthId, szName, eList, kClient); + } + } + else if (eAction == MenuAction_End) + delete hMenu; + return 0; } public void OnCaster(eTypeID eID, int iClient, const char[] szAuthId) { - - switch(eID) - { - case kClient: - { - LogMessage("[OnCaster] eTypeID: %d | iClient: %N", eID, iClient); - CPrintToChatAll("%s {blue}%N{default} was registered as a caster", PREFIX_TEST, iClient); - } - case kAuth: - { - LogMessage("[OnCaster] eTypeID: %d | szAuthId: %s", eID, szAuthId); - CPrintToChatAll("%s {blue}%s{default} was registered as a caster", PREFIX_TEST, szAuthId); - } - } + switch (eID) + { + case kClient: + { + LogMessage("[OnCaster] eTypeID: %d | iClient: %N", eID, iClient); + CPrintToChatAll("%s {blue}%N{default} was registered as a caster", PREFIX_TEST, iClient); + } + case kAuth: + { + LogMessage("[OnCaster] eTypeID: %d | szAuthId: %s", eID, szAuthId); + CPrintToChatAll("%s {blue}%s{default} was registered as a caster", PREFIX_TEST, szAuthId); + } + } } public void OffCaster(eTypeID eID, int iClient, const char[] szAuthId) { - switch(eID) - { - case kClient: - { - LogMessage("[OffCaster] eTypeID: %d | iClient: %N", eID, iClient); - CPrintToChatAll("%s {red}%N{default} was removed from the casters list", PREFIX_TEST, iClient); - } - case kAuth: - { - LogMessage("[OffCaster] eTypeID: %d | szAuthId: %s", eID, szAuthId); - CPrintToChatAll("%s {red}%s{default} was removed from the casters list", PREFIX_TEST, szAuthId); - } - } + switch (eID) + { + case kClient: + { + LogMessage("[OffCaster] eTypeID: %d | iClient: %N", eID, iClient); + CPrintToChatAll("%s {red}%N{default} was removed from the casters list", PREFIX_TEST, iClient); + } + case kAuth: + { + LogMessage("[OffCaster] eTypeID: %d | szAuthId: %s", eID, szAuthId); + CPrintToChatAll("%s {red}%s{default} was removed from the casters list", PREFIX_TEST, szAuthId); + } + } } - /** * Returns the clients team using L4DTeam. * @@ -630,7 +626,7 @@ bool bIsSteamId(const char[] szAuthId) if (iPos1 == NO_INDEX) return false; - int iPos2 = FindCharInString(szAuthId, ':', iPos1 + 1); + int iPos2 = FindCharInString(szAuthId, ':', view_as(iPos1 + 1)); if (iPos2 == NO_INDEX) return false; diff --git a/addons/sourcemod/scripting/readyup/panel.inc b/addons/sourcemod/scripting/readyup/panel.inc index 4e9c4fa0f..099909740 100644 --- a/addons/sourcemod/scripting/readyup/panel.inc +++ b/addons/sourcemod/scripting/readyup/panel.inc @@ -133,7 +133,7 @@ void UpdatePanel() else { ++specCount; - if (casterSystemAvailable && IsClientCaster(client)) + if (casterSystemAvailable && bCaster(kClient, kGet, client)) { ++casterCount; Format(nameBuf, sizeof(nameBuf), "%s\n", nameBuf); From 514c0d384e59277b09aff98b241fd60d46d172e0 Mon Sep 17 00:00:00 2001 From: lechuga Date: Sun, 30 Mar 2025 00:30:49 -0300 Subject: [PATCH 4/8] Fixes add-on enable logic in the launcher system. --- .../plugins/optional/caster_system.smx | Bin 30588 -> 30588 bytes addons/sourcemod/scripting/caster_system.sp | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/sourcemod/plugins/optional/caster_system.smx b/addons/sourcemod/plugins/optional/caster_system.smx index 0daf6a6101eb0a8ef8795d813971f843935220cf..494e7743111d949ce9bed83c5d7432262b00a8a4 100644 GIT binary patch delta 29674 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 Ie%>_rKg4BVLI3~& diff --git a/addons/sourcemod/scripting/caster_system.sp b/addons/sourcemod/scripting/caster_system.sp index 9f7e4165b..2a8bdff31 100644 --- a/addons/sourcemod/scripting/caster_system.sp +++ b/addons/sourcemod/scripting/caster_system.sp @@ -409,7 +409,7 @@ Action aReconnectCastersTimer(Handle hTimer, ArrayList aCasterList) public Action L4D2_OnClientDisableAddons(const char[] szAuthId) { - return (!g_cvAddonsEnable.BoolValue && bCaster(kAuth, SERVER_INDEX, szAuthId)) ? Plugin_Handled : Plugin_Continue; + return (g_cvAddonsEnable.BoolValue && bCaster(kAuth, SERVER_INDEX, szAuthId)) ? Plugin_Handled : Plugin_Continue; } void vPlayerTeamEvent(Event event, const char[] szName, bool bDontBroadcast) From 258ea3e2a97f019a90862373d929f14d40a97b8c Mon Sep 17 00:00:00 2001 From: lechuga Date: Fri, 4 Apr 2025 13:37:57 -0300 Subject: [PATCH 5/8] Add title phrase for non-admins and non-Caster --- addons/sourcemod/translations/caster_system.phrases.txt | 5 +++++ addons/sourcemod/translations/es/caster_system.phrases.txt | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/addons/sourcemod/translations/caster_system.phrases.txt b/addons/sourcemod/translations/caster_system.phrases.txt index 041c1983b..5c78b254f 100644 --- a/addons/sourcemod/translations/caster_system.phrases.txt +++ b/addons/sourcemod/translations/caster_system.phrases.txt @@ -293,4 +293,9 @@ { "en" "No players found" } + + "KickSpecsVoteTitle" + { + "en" "Kick Non-Admin & Non-Casting Spectators?" + } } \ No newline at end of file diff --git a/addons/sourcemod/translations/es/caster_system.phrases.txt b/addons/sourcemod/translations/es/caster_system.phrases.txt index e163e4bd6..ccf67abe7 100644 --- a/addons/sourcemod/translations/es/caster_system.phrases.txt +++ b/addons/sourcemod/translations/es/caster_system.phrases.txt @@ -293,4 +293,9 @@ { "es" "No se encontraron jugadores" } + + "KickSpecsVoteTitle" + { + "es" "Expulsar a los espectadores que no son admins y Caster?" + } } \ No newline at end of file From e2da7e573d11554b81b175bb63e5b78182bafd52 Mon Sep 17 00:00:00 2001 From: lechuga Date: Fri, 4 Apr 2025 23:44:44 -0300 Subject: [PATCH 6/8] Refactor iCasterNative, iWhitelistNative, and iInmunityNative to streamline target handling and improve code readability --- .../plugins/optional/caster_system.smx | Bin 30588 -> 30391 bytes addons/sourcemod/scripting/caster_system.sp | 151 ++++++++---------- 2 files changed, 63 insertions(+), 88 deletions(-) diff --git a/addons/sourcemod/plugins/optional/caster_system.smx b/addons/sourcemod/plugins/optional/caster_system.smx index 494e7743111d949ce9bed83c5d7432262b00a8a4..5a16c4e7efd45e9bf4959b04e70464cf0aac2633 100644 GIT binary patch literal 30391 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 I=N>Nn4^MZbcmMzZ literal 30588 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 diff --git a/addons/sourcemod/scripting/caster_system.sp b/addons/sourcemod/scripting/caster_system.sp index 2a8bdff31..5a40d6f52 100644 --- a/addons/sourcemod/scripting/caster_system.sp +++ b/addons/sourcemod/scripting/caster_system.sp @@ -156,9 +156,27 @@ int iCasterNative(Handle hPlugin, int iNumParams) { eTypeID eID = GetNativeCell(1); eTypeAction eAction = GetNativeCell(2); - int iTarget = GetNativeCell(3); - char szAuthId[STEAMID2_LENGTH]; - GetNativeString(4, szAuthId, sizeof(szAuthId)); + int iTarget; + + char + szAuthId[STEAMID2_LENGTH], + szName[32]; + + switch (eID) + { + case kClient: + { + iTarget = GetNativeCell(3); + GetClientAuthId(iTarget, AuthId_Steam2, szAuthId, sizeof(szAuthId)); + GetClientName(iTarget, szName, sizeof(szName)); + } + case kAuth: + { + iTarget = NO_INDEX; + GetNativeString(4, szAuthId, sizeof(szAuthId)); + strcopy(szName, sizeof(szName), szAuthId); + } + } #if DEBUG_API LogMessage("[iCasterNative] eTypeID: %d | eTypeAction: %d | iClient: %d | szAuthId: %s", eID, eAction, iTarget, szAuthId); @@ -169,33 +187,9 @@ int iCasterNative(Handle hPlugin, int iNumParams) case kGet: return g_smCaster.GetValue(szAuthId, g_iDummy); case kSet: - { - switch (eID) - { - case kClient: - { - char szName[32]; - GetClientName(iTarget, szName, sizeof(szName)); - vRegister(SERVER_INDEX, iTarget, szAuthId, szName, kCaster, eID, SM_REPLY_TO_CONSOLE); - } - case kAuth: - vRegister(SERVER_INDEX, NO_INDEX, szAuthId, szAuthId, kCaster, eID, SM_REPLY_TO_CONSOLE); - } - } + vRegister(SERVER_INDEX, iTarget, szAuthId, szName, kCaster, eID, SM_REPLY_TO_CONSOLE); case kRem: - { - switch (eID) - { - case kClient: - { - char szName[32]; - GetClientName(iTarget, szName, sizeof(szName)); - vRemove(SERVER_INDEX, iTarget, szAuthId, szName, kCaster, eID, SM_REPLY_TO_CONSOLE); - } - case kAuth: - vRemove(SERVER_INDEX, NO_INDEX, szAuthId, szAuthId, kCaster, eID, SM_REPLY_TO_CONSOLE); - } - } + vRemove(SERVER_INDEX, iTarget, szAuthId, szName, kCaster, eID, SM_REPLY_TO_CONSOLE); } return 1; } @@ -213,9 +207,27 @@ int iWhitelistNative(Handle hPlugin, int iNumParams) { eTypeID eID = GetNativeCell(1); eTypeAction eAction = GetNativeCell(2); - int iTarget = GetNativeCell(3); - char szAuthId[STEAMID2_LENGTH]; - GetNativeString(4, szAuthId, sizeof(szAuthId)); + int iTarget; + + char + szAuthId[STEAMID2_LENGTH], + szName[32]; + + switch (eID) + { + case kClient: + { + iTarget = GetNativeCell(3); + GetClientAuthId(iTarget, AuthId_Steam2, szAuthId, sizeof(szAuthId)); + GetClientName(iTarget, szName, sizeof(szName)); + } + case kAuth: + { + iTarget = NO_INDEX; + GetNativeString(4, szAuthId, sizeof(szAuthId)); + strcopy(szName, sizeof(szName), szAuthId); + } + } #if DEBUG_API LogMessage("[iWhitelistNative] eTypeID: %d | eTypeAction: %d | iClient: %d | szAuthId: %s", eID, eAction, iTarget, szAuthId); @@ -226,33 +238,10 @@ int iWhitelistNative(Handle hPlugin, int iNumParams) case kGet: return g_smCaster.GetValue(szAuthId, g_iDummy); case kSet: - { - switch (eID) - { - case kClient: - { - char szName[32]; - GetClientName(iTarget, szName, sizeof(szName)); - vRegister(SERVER_INDEX, iTarget, szAuthId, szName, kWhite, eID, SM_REPLY_TO_CONSOLE); - } - case kAuth: - vRegister(SERVER_INDEX, NO_INDEX, szAuthId, szAuthId, kWhite, eID, SM_REPLY_TO_CONSOLE); - } - } + vRegister(SERVER_INDEX, iTarget, szAuthId, szName, kWhite, eID, SM_REPLY_TO_CONSOLE); case kRem: - { - switch (eID) - { - case kClient: - { - char szName[32]; - GetClientName(iTarget, szName, sizeof(szName)); - vRegister(SERVER_INDEX, iTarget, szAuthId, szName, kWhite, eID, SM_REPLY_TO_CONSOLE); - } - case kAuth: - vRemove(SERVER_INDEX, NO_INDEX, szAuthId, szAuthId, kWhite, eID, SM_REPLY_TO_CONSOLE); - } - } + vRemove(SERVER_INDEX, iTarget, szAuthId, szName, kWhite, eID, SM_REPLY_TO_CONSOLE); + } return 1; } @@ -273,23 +262,29 @@ int iInmunityNative(Handle hPlugin, int iNumParams) eTypeID eID = GetNativeCell(1); eTypeAction eAction = GetNativeCell(2); - int iTarget = GetNativeCell(3); + int iTarget; char szAuthId[STEAMID2_LENGTH]; - GetNativeString(4, szAuthId, sizeof(szAuthId)); - bool bInmunity; - -#if DEBUG_API - LogMessage("[iInmunityNative] eTypeID: %d | eTypeAction: %d | iClient: %d | szAuthId: %s", eID, eAction, iTarget, szAuthId); -#endif + bool bInmunity; switch (eID) { case kClient: + { + iTarget = GetNativeCell(3); + GetClientAuthId(iTarget, AuthId_Steam2, szAuthId, sizeof(szAuthId)); bInmunity = bSpecInmunity(kClient, iTarget); + } case kAuth: + { + GetNativeString(4, szAuthId, sizeof(szAuthId)); bInmunity = bSpecInmunity(kAuth, NO_INDEX, szAuthId); + } } +#if DEBUG_API + LogMessage("[iInmunityNative] eTypeID: %d | eTypeAction: %d | iClient: %d | szAuthId: %s", eID, eAction, iTarget, szAuthId); +#endif + switch (eAction) { case kGet: @@ -299,34 +294,14 @@ int iInmunityNative(Handle hPlugin, int iNumParams) if (bInmunity) return 0; - switch (eID) - { - case kClient: - { - char szClientAuthId[STEAMID2_LENGTH]; - GetClientAuthId(iTarget, AuthId_Steam2, szClientAuthId, sizeof(szClientAuthId)); - return g_smSpecInmunity.SetValue(szClientAuthId, true); - } - case kAuth: - return g_smSpecInmunity.SetValue(szAuthId, true); - } + return g_smSpecInmunity.SetValue(szAuthId, true); } case kRem: { - if (bInmunity) + if (!bInmunity) return 0; - switch (eID) - { - case kClient: - { - char szClientAuthId[STEAMID2_LENGTH]; - GetClientAuthId(iTarget, AuthId_Steam2, szClientAuthId, sizeof(szClientAuthId)); - return g_smSpecInmunity.Remove(szClientAuthId); - } - case kAuth: - return g_smSpecInmunity.Remove(szAuthId); - } + return g_smSpecInmunity.Remove(szAuthId); } } return 1; From 6c6fd45b8a07f95a5a3a860e324153a17fe7c4f1 Mon Sep 17 00:00:00 2001 From: lechuga Date: Sat, 5 Apr 2025 00:24:13 -0300 Subject: [PATCH 7/8] Refactor iCasterNative and iWhitelistNative to improve logic for handling caster and whitelist status --- .../plugins/optional/caster_system.smx | Bin 30391 -> 30506 bytes addons/sourcemod/scripting/caster_system.sp | 41 +++++++++++++----- 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/addons/sourcemod/plugins/optional/caster_system.smx b/addons/sourcemod/plugins/optional/caster_system.smx index 5a16c4e7efd45e9bf4959b04e70464cf0aac2633..09dfec3939d10a3be92e891f4b2908834eac54da 100644 GIT binary patch literal 30506 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 I=N>Nn4^MZbcmMzZ diff --git a/addons/sourcemod/scripting/caster_system.sp b/addons/sourcemod/scripting/caster_system.sp index 5a40d6f52..a66fa6c9b 100644 --- a/addons/sourcemod/scripting/caster_system.sp +++ b/addons/sourcemod/scripting/caster_system.sp @@ -182,16 +182,27 @@ int iCasterNative(Handle hPlugin, int iNumParams) LogMessage("[iCasterNative] eTypeID: %d | eTypeAction: %d | iClient: %d | szAuthId: %s", eID, eAction, iTarget, szAuthId); #endif + bool bIsCaster = g_smCaster.GetValue(szAuthId, g_iDummy); switch (eAction) { case kGet: - return g_smCaster.GetValue(szAuthId, g_iDummy); + return bIsCaster; case kSet: - vRegister(SERVER_INDEX, iTarget, szAuthId, szName, kCaster, eID, SM_REPLY_TO_CONSOLE); + { + if (bIsCaster) + return 0; + + return g_smCaster.SetValue(szAuthId, true); + } case kRem: - vRemove(SERVER_INDEX, iTarget, szAuthId, szName, kCaster, eID, SM_REPLY_TO_CONSOLE); + { + if (!bIsCaster) + return 0; + + return g_smCaster.Remove(szAuthId); + } } - return 1; + return 0; } /** @@ -233,17 +244,27 @@ int iWhitelistNative(Handle hPlugin, int iNumParams) LogMessage("[iWhitelistNative] eTypeID: %d | eTypeAction: %d | iClient: %d | szAuthId: %s", eID, eAction, iTarget, szAuthId); #endif + bool bIsWhitelist = g_smWhitelist.GetValue(szAuthId, g_iDummy); switch (eAction) { case kGet: - return g_smCaster.GetValue(szAuthId, g_iDummy); + return bIsWhitelist; case kSet: - vRegister(SERVER_INDEX, iTarget, szAuthId, szName, kWhite, eID, SM_REPLY_TO_CONSOLE); - case kRem: - vRemove(SERVER_INDEX, iTarget, szAuthId, szName, kWhite, eID, SM_REPLY_TO_CONSOLE); + { + if (bIsWhitelist) + return 0; + return g_smWhitelist.SetValue(szAuthId, true); + } + case kRem: + { + if (!bIsWhitelist) + return 0; + + return g_smWhitelist.Remove(szAuthId); + } } - return 1; + return 0; } /** @@ -304,7 +325,7 @@ int iInmunityNative(Handle hPlugin, int iNumParams) return g_smSpecInmunity.Remove(szAuthId); } } - return 1; + return 0; } // ======================== From 907fc9475e5758f83ff59e7d834c2d4fbe2bf418 Mon Sep 17 00:00:00 2001 From: lechuga Date: Sun, 13 Apr 2025 03:55:28 -0400 Subject: [PATCH 8/8] fix phrases --- .../translations/caster_system.phrases.txt | 16 ++++++++++------ .../translations/es/caster_system.phrases.txt | 16 ++++++++++------ 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/addons/sourcemod/translations/caster_system.phrases.txt b/addons/sourcemod/translations/caster_system.phrases.txt index 5c78b254f..33493d1d0 100644 --- a/addons/sourcemod/translations/caster_system.phrases.txt +++ b/addons/sourcemod/translations/caster_system.phrases.txt @@ -103,12 +103,6 @@ "en" "Whitelist" } - "PlayerNotFound" - { - "#format" "{1:s}" - "en" "{red}'{1}'{default} not found" - } - "Reconnect" { "en" "You will be reconnected to the server, now {green}you will see a black screen instead of a loading bar{default}" @@ -298,4 +292,14 @@ { "en" "Kick Non-Admin & Non-Casting Spectators?" } + + "KickSpecsVoteSuccess" + { + "en" "Ciao Spectators!" + } + + "KickSpecsReason" + { + "en" "No Spectators, please!" + } } \ No newline at end of file diff --git a/addons/sourcemod/translations/es/caster_system.phrases.txt b/addons/sourcemod/translations/es/caster_system.phrases.txt index ccf67abe7..cddc1481e 100644 --- a/addons/sourcemod/translations/es/caster_system.phrases.txt +++ b/addons/sourcemod/translations/es/caster_system.phrases.txt @@ -103,12 +103,6 @@ "es" "Lista Blanca" } - "PlayerNotFound" - { - "#format" "{1:s}" - "es" "{red}'{1}'{default} no encontrado" - } - "Reconnect" { "es" "Serás reconectado al servidor, ahora {green}verás una pantalla negra en lugar de una barra de carga{default}" @@ -298,4 +292,14 @@ { "es" "Expulsar a los espectadores que no son admins y Caster?" } + + "KickSpecsVoteSuccess" + { + "es" "Adiós Espectadores!" + } + + "KickSpecsReason" + { + "es" "Sin espectadores, por favor!" + } } \ No newline at end of file