)T*^UVHYi75 z3{i>7m31?iNqNrNU23f2ShV8i -+D$|70o~c${^A6?U5{1=Z9web5n{tPiV~Itd-FC+40dk-oRO zntAXG=i1rZi8D%>8DjTeNgUK1tQBQhoiESrjZ(|aY@V?p+aYdON@72ZshEtWOSOM2 zUO&1$Fw{IgOy1}F 4(KNQz~Uo)^WA4L&CxB(5#o)ylxGAN(=7SZ@CkHaSe)bySO-!Y*&LCnnOe# zn*|^2pWJpW7q(Z7E}Gly4|SRxFaNrl8FW3eeI;tqzrLG~u&V84xiEOKbtk~TDsMbP zXZPU4_Ur@C`D}14%-`N(?{V9F(*n8Kk46+%Ig)&9Ryp|9eeS@={OA1==1paqorYD& z$V#G>>)0^w6aB_*UPm!{^Op3xQNtgfX02ArM5H5*m;3_ez>btVayRg6imd)5KGZ0^ z-sVIG`@Jtqf+NE#R-db>8)G- Hd|bC4iAP2U%R)g7ADpA zw)A@U?tS^QYNKY>D%3Hr9mckq71I0KyTfg4c-CiC$h@s%K6cTR==%6|Wdq4EZ@c;_ zfo;?zYTaMWS&)p|Xur4nQcZkgtX;~DjkuxyASZ6q;_`uhvk%%*LqLu}{5^IPspk!e z$&QbH#z{{74Oc>vLhn?Xx3eQqwvG^;*)osNXnU)4W(VW z-HKz%q%c9_fyd5cZL1;22v^$qOsrXBW7f&o`#~P_?=~{2{VdW7h#h7d;Q&~(chRah zG4yKwO0;nFnyz=%s#2o%cJL$}g)W-QAUb-6wW5_TJ*;h8ODnn=>Zm1p{Pe?oYZk+v zvVF`Qv)XE9$bE1n&s}~s&pm4OtNU_*sLn;dJ#pN^y^6fU3fFl}PWjg}d)7t1yZIXZ znyz6;SnjP)s?}=mAf$^w!Ygd`?FuD0$=eIAxW2shkHLxNBvE -_Ok$K`&H(WuM(!W(l@6+Zulg9>>C$*41S5XK8@AeDPUK5 zG13gLeg>!SUhLhJD_7~X6#Ik28=)hw8uHv0>n1^b4sK#Hzs_1mfN=~l6B+SR^NKRG zt7#^c?PN-pH_1NqmQL+Azc&}1YP#+py)3qlZ-Sy5B8bWFKHM6E7XuHBpS-?p-$}`C z2XuzyUhs@wE `uZdSp3l%BGf{UA5I z%j4Q6e+j)FcNrzb(<--f;vdPL-E^$ P)U)4WLp2WD4Y9 4frv_ThdR!6m{tY3^B}Nt64QX0ac2m5cWq{dHU2^N6kw53WK` zNbgFlg{{BYDKpSkJB&OIXbUE;>@8J>J4AhpIURPPKU{Lcyus{mHlk9-eUY2O9P_ dO1;>s%%W(yZ%IcVx-Rc+zJTk^7^r)F(g0`^&b6}th>)_@I z=|#wB7MDP4_Ak;0#|ee(QKiYX`vvTSDMzeQ*M_V3cKVbNeR-lyT@twp%BPh3ZEv3J zsaZAmW+~N)vpfQ&;{!c!;L|dR(g)m7@lu+#cM~MhoR!zkx{=hgEkx7x+cqBMQ9mo_ z{F-N23oAUXdw6SmMDh&jf%;bGP>+9=ikjL^@PPuTX=F2@dB!K4aJXc>z}TI`zVUC1 zGZWF$>yf$`%85K$#hn>j`JTzM?9O)G!VIZ#kd5>BVM`hhB$j@-qExo_z<%PeC4&co zBQ=@FYVUi@=Jnt)3pv)wXGwoFPUA5^=;3^NMJ>iCOEG);;q9ey9u2y%3Y~tB90SX+ zzctpm1BX@muN^+8QNAAf9mC|tC!hY96vtb8&p~w(V>w+Wj8nslj%@Xld4d9`K&=|~ zVXh_EsJG
btt?6)w&=UHR5$@l$f{0)t*)3~ cgw3dkriA{WA$b38C@ za{NesRk+zgn~f{wpxhwM@$r$FZtd<*_4oEzpoD3s`&&?w=OW1pD7Ko>WtoR0;#<6O z30 edqS<&JK(OzAK^ehlTVT zEAwPVH8A3@RI`CFFFqPerCgfW2|s;V4ts2ExOb)}yx#9uqT-XLUDFmEOOc?Z@2WP$ zb#9AH0m%NYr|~a*Wd$VMe{>E*)Jz#h{!IwQ3v^7gMAUTPod1LUGZYnO3nN?8g)P7Y z*Y4IPoDsj(by9v6LcYOVl5LuF-hoNM*t!ftn6o3BDV7wPY@5)Uww&$O8la&td}j#k z`VVE0&`=w-GXqSiGb W AuqjfDh_e`a1dcN zo0OVfEP KxO4TFVH5fz?i)won6SCBc9 z>XYlgbbRSZwPez?;as@J1~mv~&c+o$(n4vZKqN-xNW27YqIG5{SX~d%>-c| u( %Rc{?xCOq$d)NOc>&HD@=H&Tz{2_Whv#Q zu<19kCLU8A79Yg`S%%E@v>G|a hpJy77YA2l z8}lrPkzm$|F5_DR3nvri8iE|MYwD~HjAi_EvTb;7&?j^8$Fna7->xS}`T29amTOiU z&mI_MjIa O}o%xk=K7^+F2r+}Qm*$BO^E1KF;;{cK&bVdXpWng; z3v87Y_lav&0mBq6YJ1*16oc@>?k1jn-N!u~T*m{i3D@z&vlZe$dlftA==j?nT0Acu zKZ=ZTw6Px&25ty$ QTRWT7HE~zh3>hTz62CiebVaExdxOI1x=vh-Po)Ndf5 Zj{(1d$)lrV7UB zRP|>|>TP7Ts?9yq8SA9qpZenw9mYuKzS1Q|dFLHS{XLoi-~MNCus8L`5Spanx-S-a zgFg+JTJYbe3IE~jr%905``mno?1_$UJtGm7%j$dk^}0K4hgxy9q$5wW?yA5Rh1Dew zKdSKK5!Ous$~e5ip~O)s c4s3By&A#Si`yb>%RJ4 zezF$Vc>Vc!e1Xog#ehj r@s(F z^}B!NDQirPPp-gx4GhiH<9okRG{)pqh;wwge7m4rwrrL5G?is_9YU!YTAfW}RvuSK z8=yP%OO0|@n1kEGZ|Jldnq{+KTi>xBSq50z0hsD8275GpFKK1|Nwe?5`Kqq0y;HlA zR&P$I*=7I)qEI<#LNQqEY9ptvqaMOUyq1z|V{>mU-a4-q-j6}gb~-!oUKr3=l&fA! zyyYAr!iOxs-fPd))|#Ew(rQ%m0Fjx{ob2!GZUzG*0*zJ|1!Bbxu#72iIG!e;nV&W9 zSB!maTZi9TU;f1@m=!Gv^!O7}?97Gl%JCfMM3-VjMu9t?q|oyV!y)cxKRUA8jMgZ| zFjZDId1DXy6+B2Y(xLY6!w3hQO1u?+ph2Oc#C6>Q$L5{5f7oIExZRtEg^!0X=`EoA zU7Pm~5_-HgSw$j9*BAqz{H8On2Dc@$wfPwG^))^KTjSqrG$^SO6&**tRkxAJ<;lMN zFr6tw6es1heCqzw<8MK7aO_NSaG@qo$F$mG7bx**EQ^?gsH!H>%9>Foc}O$MQmZ^= z!|xto9$X$+<+`gNQ)2EJm}`e3*agnlGalN-+NH+hcT-Dlo_Ohk*8@b6k M#az^Nf>Jf_}b265?9%omNQ#oRBX{+4WqzbexG%qylcZ22L4;cvjc z68|^Fes#@6F7fX=D{=<~$>ZZnpIvBJK=-LxrB1yp5aEgxR18!lvWv5(;s9YwA(A`q zC(roS<$xeI>#q-3MRSqT?k|TA<&u?MkEyY0KGx$2c|JNdu`!9er<+^fDASOH9AdBY zedc{09)`%5Xm3p|mt7QH>n%+!RW-?qXv>wR&*AO+)xDXbN3CFa7ppes{w_=B-B|5p z3P0-KO8<=qe#`qN233vUWmeze`_UCr5%Cv3Mu>}l@pE$z_GxB)%1 #@p5MqO(E66Z(!; zY1+M1kyEP6LDJ4Buz(dut@gE}7hrHlcP1=2Y)5-$%k) H`%Z0`Yu^hNT1LCVIQwACx0|Bj(aCQ1$`tNQ`jm3Po z7?0CF2?-0yUe`VUc`J}%w%2yNZ(y8~NtK2p23ETEEpGLzBe|J+Gf3ax95Es5ife=B zEJgqT|M2q-$^oDS8LcH=zx4^U<#lcWJ|buCB%LUUVMNnR76!#YhoL+V_d(^*kB=3x zUU!>*%Ix=>0iqpSNhhjQ*Zq*3*xOA?*4}_~#lF$IO(8EU|8vSNt$_3P9H;xu#f{aQ ze*U8X$@8||V##x*v-@BzmyVw@D-jJvGVL1Y5(%wVo{9;XgL}v+!P)N;y@n2v*&w|& z*QWra<5i=#CoXr+3I6OCH&L693OOu^H*T3si8tT}gM`e|TO$SHt4G?V(LawwOJdNr zlAD@aNAZh4ieY*$Z< Av zHM7=^edEwX)v3rPE(8@pY6KmVHaR%&am`y@iNSFH1P~sNuC=4wpfp8z^PL2jekl#L z`(_u0^#|uq8~QPdGgat4#gZ1R9ruQ^iRw@CdRn_(iSS}vXB&|t^HK{e-X23<=OD)r z(oouFwvm2Sy5&1LupNs-ULLDaerElaaB04tCLvlvtN7>(ZZ%_~!p+7XYTg@$H{$4D zEIB}NKbNg`CL>fhDEa&~dp?oh3Ep+t(Q+oW+H#N?5ceK-zp4M^6g?@E9M$k w21$qvh>PXqOG)ZwD(bN0r6;G0%5Oo3E#uOR?N;*epb6Qf GRk@9yY$&nIv3k+Uvv*;(WQO(u683_cPCOI} zG||bNOtuF>lJ~`jd wRO)+Y2OR`PE#C~;#V?KG&3rB6eh6@+zZWfT@?nkL7;h!&QV z ?aKoG`2LAx_|xxu<@KsaK1En ukuNR6rI}$dmq0^z6Gc^NmZ( z{Jc8p4I5?#&dmBfjnC=4)hgb7a^sMGpBH&{i7CDmaA_|cxonc*pZ%~8ZBQEKcSvX? zA9Kd`Copu4m%fKu(NRWUebc)9sZyHUP=Wn6F9LOFp+fnKeOO*iLr7YZjUTuzk#B`9 z-7$T-uAMboZqYO4>hOzuApW_uk(;P7xye+_b$yW_uEZx&<@=TE(RZ1#!&0O!ToHTD zzr0zNzel5s8@Jcd2}AK?*%)4=i0l2W=kh3Zu!$vZ(IJ{ 1;w$%xK6%F^NZjNyS}%z`)vO!{(d?=Y6`o}*f gR6Ore# zy^&Q@NF>B$bc^VweK1P-X_xrAXHW^wcdL_L>tr@fmv%(K<_k1oe*>w1z^bT<>_nVGx2e?!W+_f_q$*&7WTY~VYTx8yJF*?zT%%bLFI<@{YL zIn%o^jjV_MH*CsU<87q0w)R(>{9@N~tO7%h&*5y?83#gq4l3WoqNxwQ^b^mZ3;37G zScGT%>6ckm0$D8Q@rH?dd@d-pn_j?S7HrYC{FAHC z>9@2}7kSWV BA&S;EI{pSD4wEaxFHVU6q2d!b^F*>Gvh6@eUb=3!bdjFb<` zULb67l;p}hIMXGH*yB!A%q2wg{3d$+6%w=79t)Q{M@L`eE!G(Ob4gG!`hBiQ@OkgE z_OAk7eu2ZE5XrfG+7SZ7623c^c=E5B8g^cPCn$=1rBNgEv%d3RzFFK%j~CY&Pnw7d zrzD3=(Kc`v ^DRx}v#QIBo9%)g@nTNMttBbmPg! zw99h-%zuiZrmW=lL);x*3+1RK;-&kXC@tq4KzC%GOo%A%#on0w4;k|M)bFUT>c!Qg z?|=pO;~?aD<$On`?`^d03&&SSa>yhYWut1;T9P3uA%{V($4ay6%kPQmC5Ln)N%R_c zqIS_%&$^8`NHOFb&z-~XSOWD@JPX!CRLs!Ue-Sy@35L8WVrC4RN!wSHno5aQIyNH3 z4i#b~vU3p+mJ*nvioTYl4Ok ycY{IJp(AHhG;i(7T&nuHM(-D`tfR}Ed ztGnQMZlviA)u ;9V z?u!jd^Yt?rDIeisNiDo;Kwt@m??kEM75IlrVVhPtUvd?TQPT7#^LcVIJRnL<{cKh1 z(iB B~hbA)TCDq %U_~D z6=Y;$_8% F zs(nPPZQZYu^uOXysV7e+`$iBDr~ch7!p~vC5wx~V%NxbgApJh41w{L>k; %wnVn&ZKp3Grz9aTaNre>I;_Bk^~p5{ zXrKL|h(4!d==%J2OjXpJ+r{;FnL={wi*Sn1ID?()id+7e4~ZTaxhUg{;p*LdPUp$9 zrB+2v{aQ0>`i5#=(vfd2OYPy9$IriYYNZucgwy9?#1|rpH*`&b8GIX)L%mv&9eKmI zJX;r+lNb&&g|g3v>Dl!@IR%e^<5a>yk3w+1$`aqr>YE(A+bX{MNuJT!2K|}szzOS_ zg4>)y0MGn|#=i3Y79bsdtF!C0XMr@~{cP4I49!P6F5Wr^RFZzXiMn(}QiQjjOb(*u zojq~;-UjikxZMT~zC=U?R~st*l+C_jzN$gCX xo!jO9Q8ivUUKDED(4UMlhx8x?k4xn0Fd-m4cY|^6hFGR zg@eex#Bkd<{qTfpcPlnT=&cBw7l#v@kA0*0e8{ZT<)gYU=~tJ&oYDO)yz_3MOV^iL z;(fI?gFeH=i?Q3cUb?2gSIr{QvV|qoA0e!qv(Jfi^nMMf!`CbXiZ>m$5x3cu0fiXP z;dGV{S}dGfflK&qPdR#~6VK6fmH{&f1pz5B+m9U$-QCX?@ h+x)@A+VKEA<7fYpoeP`jbuF6_Dx2j)YEaY7L<#A{$vhZPq zdH$IC8D86nxwO}kqnjD9y5I7wKKq!{eC)*B-~QaweRy9YJAdQmG}s>a*W(#u_R-7W zCb;JCo^1AU6>==bOLzZNbnv6)(Z5>P=#$|pYz`oLk4JVw3Zv4{*2IUW?I~%uOC4mq zyg!Ksc5t0qq6mw {Hn zKSaOCZh$P*efTgnYo4{4C#l4ud~Ei6q}?U& `qw$> zj_F{lRVzhPq@t)$cH~r~=hscBa4-8LntngA(-Xud*9bYA4L>5_mG?+u&*mSv0!$1* z9{k*=I0n5~!ozrAa;7@9^S2Emes>mJi7XxToL8S)sg9p3E>+}!)X|B;0}Vuz3SND2 z%$kz0{_-@iHYVu#(=ke7U Jzgw>#5Mvcj1o Ox*>|2JHliAsZq+{qV=M z@yvPzKCoYlo${8Wx`=mHMEr3_4;F>F7{59_lpuY@juI7|Z`_Ts^b+y60XB4{7oI7Y zPS{8cNI-xSN;`7qPz-85jR6}{A>16L`*V)H{g0kkueFbph{u;I_}P|_mVm7U-q_k7 zvnR-@*pN@oBl> bQJ>}kGy6iu z-@i^#nMZ4~p==E|gyU$pUy@(kzN%S6Y~oFm4G#HXqeu|m^L(Zy>Kb6vA_KeTt z>go6@h zv5oS;b_?_lJqun%Nm-8F3EEp?BUd5|dj2Si^i-&9$m0_8fc5Z8+3>x~G6Q=ioZV3+ zSlB=7!6R%)3jPPf_V;~o={v2U(qvtvG({ixLi;h(a8%-sD!qTCWHFJpQi&h|N6UBsp$63(zj( zgS{zLe}2yr6^1^u!mx0+a=%HdRv0AoPC7{ZdmOh#?gR+N&XL)p6?C%R#Hr46=LR)0 z_pyxp#?Pg0_)RaM!}@wK=w4e1=Eq1J+%e>`0iFkVAi+fkEMS#YMj*W5K!H=hmcZ#_ z8Sr#=UKH3j$4gL~wfZ(k>>Zgs$|(v3kOvn@tnbcF7*%-4bIh9v{$_@o`aL;((cUNq zf?UIS@Zp1@zAqm9RYBny^69(Ydbv(AY9r0Xg6di|QD4u`8)tI2@zZH?Y1NtK-(4E( z<$9J4G`NnBD-+MIKO{%jN|%^twrSIC9Og5TTA|dM`#b!g+mP8{Ar)(}>W8~{r$ke2 z)ml7QXRvPcrp cV#xxzp{czz)+p}Tu7Js{9dNK??k d> z!474_rw(Oe&b0S-uQmy`-c*Hb08VWN0${HPj9{9uX35`+S?Hp@-d9`|?#?0fTkKV- z8{oE~aOJ7NZ(Yn+G|z*?X4k{6Y$<83==| )@3x$;x&lw5%rK04(` z_Di~kGWhuu*p@J>sb00GtEdMB8feiH!zG$+|J}uf1b$+_Dn&|FN|kh0z0FBV6(>f& zu|Wp|YCq?5DM_Ucy!SCLj!r5J65IA}|J>7iAaC(o_3`z5-#pT#TNj5jvWJT?hKD0e z!V&sH33-NvpbTXNZ3&qL#S^*EIhVnij5Q6q7|a^Caf{l3eDdNLbp>?^y_Nhuc5B!z z(#giRF@`azCF;Ac_U}Xh{s3<>ZP~jdZ^Pg%sLql#W+oN|@`%|J)OH31&M}ETgQSdf zpu+|;o$(V`uMs5^;yFfRLjs|TeriL5zvFMIz{5r&*EylzH7VnFX1qXc&zFgvb8&Pd zgTLpmaqZ%{K;?5mVXg|j lB;$SC>`}&ujD6>d$$g?PM zNc;e0z#=JVuJby$=7NWR2ALn}J~$&-H3ppr7p1YrA8Mt|_D Jt>^LEUrf#x@vxR@ORw{6)rX(sKN(CNktLsehBIq_C<>05Q_;5 z?&$JF0)IWi79P0d3*S1m&KSy<4hn>xi`zVk&yd407s=t$P%NmJWxI-HT %pW1?4m>So;YX}K zl=%9;okc;l7<+$y56rqkiRA#Dl1rYu+&dvF+fuBs@Vx~8cru!6&)5n=6%&1~WC5NE zZ4$#esttlxX>(9IM(^y2HhX6Sp*tWr)h0SDutuNk_UyuL(=KL~SJN! V)$lD9N?^?6t!G-CgAZg*?)p4r1$^tw&)S|E{1?g$#XvN!C5-u<@twU2wGD3o zg|4WW?{U1*v~gPpP>7+CR)1-PP_&Wk12kE>(Rt6sC%J=Yp?=nd$SZ^1Kc<$@v28Y` zGf&V#sAxgGK^jmusLtI1QLT*t+K7oaOdl4^R{cH)O_SR|A@(&uF9=vIyzF`!N_ARp zA=2^}Kj4M-PHNl<8(Q{JN-`hV_~w X
OFZSwt%${}Tnee74;#ugni3Jmy2SJy?w{u&d z4*w4^?@{1U&@HGJ_d`%wl~l0bJP?{X@90v^nmy@F2?t%FQb%J!ZDH)SSwZ)~y`1x4 zu|?Sp#5=k+6B<$mq+jj$d;J0&G)j5OaZ3n)BT5Wiwe&+08}bj9MhpQljoALV5V-x} zLp+t)?aK>F!o?j7*hzI@FqMT!V@Tt}`Ku%`V?TfxnlQ$Lc!&Sb%{ZMn%9JY?Q7`BQ zln<5z-wNT)c`@NH(|l+c!_hwe+kQcEVV>$kdQl~V&As48@~#HpPH}o~=~vg#Sm}$K zeH2Y3%0kUvo!=YIya|@~40T5t4Ir?yWr)%NDd*L@3`{Y^zZfu959S%HV#{`}I?I2I zB=IHsvFPBKt<(jdc723gmArHS-RPNaz`_z&QEq a|Ac6@O^NV_b!yYzDD}U zC@TtLo1)^Z4V=SH)j|awi$=)PCDKomS%b=~34HKW6%Q3@l({1{R_RAdPtW@Dd?gfU zQn99d<77AA$kz8+;QJ)1>EJ8U#3`3-;UdC*A1E-x_u)_{)m1bter$f9)R&BH!NeCK zrx`FOxw)q7amUS^SARb_L#6B%UiUQLD>HqbjoGX?)HlE iPL{sR!OZ>9TGEe8*OD%f3?hp0EgPD=mF>u*m%; zm9*Q0RrhfeZt)n*?#@1YKDX+GfAys_5GvXFL>Ad?k~m24#xEjyYg4
$f4WR{eRpA0CnfVh6F$h@9jGau@GSq=)Cp(G zwpn^z%RnOeKKvuL`|eVQ1-_np-@#wg4c3eUrb1caUK+(-j(`%}8ruZ-Gaq~^0B1?W zW<1v05j2-?^oc0!3EEw#W1+ZbOc7D^;TDthB}?QuG;U%_mb-v6YP1V5+W_1unuo*p z<^`wuT=&LXsgL@O1Y$zJMX7ccF-${03X88pKDJJoN $jBI+6o;!!+{}uVwT5L+#1fmDxP< zZ3t>7hVX`Y983XjNl}rV@s`7SKc_?)+lpJvM5m=Q!ea-`CDa)rbVx12Ev5JpNQ q&;9SJo2M6pa8=`9zMMpa`zy0>^o;nhOs=q){}>1$*dh!|*dlQK@- z?GsvZ=+EfzZWbk`3`8=}KPqgjb(D#h6bK=kmMTj0m3po*^KjB0h~loxK*T@u-hGbv z;c9PMAjQX7Dn fxSzhH5Uy7?F4#Bhxxx4( zYG;n8v229mQlKcooBT5UOT^#gdR$eF3sJl{ThoGc!jCo~KZ*+!he|BJS!+(x*QAqL z!b(0p(^eoxKr@~6cN*fHToSYFGM0hOLU$Ptw* i9#_B_wt83PgcW!AWVk9%^tA`wwGy0<0 z7IpC)vKX?H5e1U*-3T*COuGX=t%@S|2fzi!9V!-MTBQkUr^+)W98KqlonJLyz&_`X z%Y9yJQt-|1EK>C=79XmcaMzNd15D=E=ozyQ 1ya`sDZ>?$^ z=nJ=PP&{nV$c>}j?7UaqMUPn$>t8-ZQ>~vUl(z_x(Uej8KLM`*Q2z(G>m+c$5%SC2 z{C*!=iZ+ |}-k!H=I zs1Or&E7A6OH0p{@L+0VQD>|)}ok>@8WztMa^bC=9QJa{yi8N;N-Kd!w4Nj7s3&$6_ MTHYl7UuQ9#xHBU6Y5)KL literal 0 HcmV?d00001 diff --git a/addons/sourcemod/plugins/passtimecontrol.smx b/addons/sourcemod/plugins/passtimecontrol.smx deleted file mode 100644 index 6894a0f4f34fb11c991667e80aa85ae31fc42736..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8037 zcmYkAbyQSc`}YTsP(efll?LgSM!HM7QyPYjVHg@jLApBzN$Kt(6eNZQ0qF+mp@$fF z=e~c>v!3^?^ oeC`+SpXm!?M!GTqB#x^-H&EkRRACiT}uef zC29b`2Q qiA;c2mow6La)=x z)!GKYX>9?r0C2i_Svmo&JpTo-g$Ej3EI>f8&A;G`HV+U8_ ej{U@?=vhei$U#Bh5#tB`H)7sLG(-!FT&%FPj6VT LJfPXiLE-u^Sr}t0& zj{LQpNyI1+qR$7rNw;0(hduje9pp0zkAK&}LU3&O?^#r?nT{j&9Qhq%!)A-uF6<$3 z_7EU}Ygd@JL61oBnko=d!UsDeTecyn?o_i<0YWIr%%EX{760r9eJ<#pQdSs~^`H0? z%0h|YE}gr&ujg~AgKnWOs`UL+$&_ySyA`p8MUwqfHXn<$a^h#{!Xp$P+!du8J#1@P zh(4=->|dkQ-IVt+WJ_w6-laCZwHpw(FZ4Oxn=bFgYHK4#y7;P*!S}tZq;r_7xp<2k zesDc_V9ybIMqQ`u>9g(Y8-=S(Rmc=1SC)rQxH(^F46&-}>lbzE+uTgL^;Ezwpe+5i zMNa*un-3$8H>S_cIHnx&d+J}_$XXe!?7#FWyVrt*yb#aZ%wX6zW*PHm@P}mjRO$a5 zQ|BEsVG!jX5v@-_3<9@-IzR3Bd|WgpO*L*%b%`aN^y*VE?j=jPa9jQHZ?ip?qxzc! z%xm9#z8wf_DU?3U@SFI(0m>cGGWfSBzY%lIi?)hfWK&LmS)}zQ03C(x_aJIsEE^U@ z-vd*B+-mSkLAvN}TVCXrX{ebqvDDeJ`o7cO!(Iys<3<^>3?+jk0%THJ|K@AOwH3pC z$W^v8@>Vi`x()GfA8MRF`@rkEd&lVCX!y%sH33z&x!u)QoGZt0 zG-`>?c?x%CmI&Bw5lk75NtgvX>Hzn *UKPWhE3Re`>Gu*RfHfR2!D&zeLg@Tof z#ptHQ=Ux^AnQM8c?NDllafB(GC(ct0%DxhZm|r+S(qX8!8&pG$vcw2i2HWq(Jq_*F z3KA` 84h%f&_*F*erk$nWwF z)b6I8M8P5PS`T!6eVGy+wY!G?ht5@gSXSCs58MJ?@ITqc^s^_|q5{=$B$ 8Y)`8rmV ErHWU-S^pTsvQHjJd}5ec2f()tNW8Z%u2P?N=F1JJ0KUTlTlGBfx;K->sjai zre%|Hf~+Xy=kw#?#6VLam6d9T0F~Lu-QS1sER$xfk8+3V(}D&Kck_Fc&Vg1J_dalF zY@D$6r0Ori41>OtTvqW{C!rm;tcOM>JnG26_)%&XAm@r5y`i9zVIVZ!gStR#DSs&C zO0Z0nSdeYMc~n7gYgwzv!^r5obE7-ErnAWJ&;5PF@$HgK)BUNXne3Z5{j{`&kT#U- z{4ImX_l=oT9y?}_fcsb=oLyCgZ?XW_Ufh}GN+wQ40;K9`Bhm1iRHW*UaT?p7#_G{3 zC&FqVXPTx1p*FR51@o8)UkvQGKCV9VPL?jHGjqhO>@9!ifpE&g**V{SLyeqpRIYpu z_(Op>+g5so&fS^ASowqodmL!((7IX&B9I&J_o(=HiLa`}^?R@UFFrf_tZANYMJ<6T za1*+%DWrm{AL?8s#ST^=edDlWY?oEy-6`h*t)Q7b#_fV~NiIh%820VWOqUxk7#+7B zS3N5@T-H5w)N5>R+`#x4url8+GE-&7@$oTHmoM-*`Mxa&rYc11PB`-INl@rvW%Gs^ ztt+9gB CqCp|Q1D?7G{x&h_=>ccI67HJP z*k#Ys#tDp?io*LemuP$LXfr7g;z>(9K3kI0lIb!&R8nVU0TbLWf(>#nXHcpvDBrk* zKMFr_27gkr@UKrA>z$I1z}N3>o 5!Dk#7=ON z7)A4p Pu= 4)^xy^=H7Yrq>~{mT7n%wo=yjy+2Mrw-qG`o$-n=g;7hLd;ledHC;C;Qxu<;tlaY zNI4wVn;>oGw*j?-;3Z@_<#`NLt4PN7H9yX2?9KsebW>Q5j(mGb!RPH})uL->9bllb zZsv+@%67A9(RF}^+D0d0HzizjbLbmagmzM-{e5WBq&3<*Q_J|~3h6Q*YD)P&dJX~e zm1s@Nw3J{iqu(M)Cg6J%WhO+G6{FvtkfH;Vio`vnj`qm Vrc=Mx1~p* zMX&mkXlGc+%J>b~5f3GMHuKuL!MEVB^78XIid3kLlDEgR@<(p?U13<(;-Tgrb&<~? z5j&6fpNR3GnAzB{CoTA2&2Z0NnPcc-`T}Hv>ASHGa49e;uwi(Rt@jh17-Zb5QY+77 zT5wUkM;?%YlXW0e2}LxPaJc2srYW)yuSrs}*)W3-w$Ux=`NicFxyZJZ$15{w#x7X3 zn=NNFB(awh7OcgJ v>`3{WqQWOS^3~7{X)4$VU<9eKxrvApgnHD57WmnLZmG#Af21OR+l}?UP`J`KII! z@1&%LUD~`)(anKBs 8HfB(*tS4RJiq2f#DHGmKmuimaYvkSc~6<|tqkixaa7u(wSnPuz`J z@u&jh9Q{Mm6YL(0`-c$n0`YQ{dDW*|C73vPD%dmlY4A`mv;P=QH=X3uyn;0jG06Va zjB8t$w`HyWZ?bOugCZWc>^cJ$d#%Hm_N0#P8kGa5Nj0MawdK7(Qx-pdjm^1 XnP+HhTCN1&gvVZ9`_sMnvAY)jlz7*o-ErW8<(^I#8QCQfA9lH8NaK`}u42 zU@%!F3APopkeW5H045bspsK4d-IZRhQ&6zTG&s>58#Oj?JMjNG>O)VF;wi??^Rjq2 z&O)_-gVoB*QGxBSDB90#)U@4U+5k?@b>N^Xl%WfzaBk4wvVP0mY;lAD05cWH-tF*v zP`73zn4W-qVZqqR wfjUL&8;piEyogoV!g$iYN Q@`HK&rSb@~lfR#>+S%<=iHwm@yBVTk5;D3djH$ILKbz&uLir zI@6It$)Rd7O=l?o2QypvB(5_fi8)F|XcrX8PV2}ezY=N3qZaE##Ts?n%i$O`uwnUH z!J05Q$ZsrlL}sRVbcE3R^6I#z?e@K(>)#GB$djXF^*H``&gi1L839p%G@(DG&L)%4 z?f{j U zFE@+^Qzj=Wx3Ng2M9>>~@!i>xoYL8GV=cJbD6+9}&_anP2y~u %2x;^0lA2pr>wzhU1eXBnRx@=FhUv0S@lQC{t7T+RP`)=})w94el6Q~NQy zI;l$vgGt@z%RHbO4fHc^uYQi6? 3hh-91BN!?!KTUVHbE12XYNapo1 z3~G}wKBB (C6v9s- y7;Y}`! zu#lbw-}dk(r!VCzJLWEN>an2h)6#R_HF$V$mCiD`f+Ve1+)nLJn{@}C_f5>!+RK|g zt=5b6Bx j=*bdq5Ea6H@1pebod@?lJ}+`yJG;LI7~nZK z24*=e$S~kAp2bR2CKI|VKIXm38+rRSom`=p3KJKFB6xElzd&@VPm{^U&3l_v9PLt9 zkNq|w>@4Oh5qqQuE5G?X{alWB%rN~NOBf%fK`bpk;TxBZa;uTd87Z!nTL^8gz$Zz% zqxn$q42b}P$L7NBibG-7ZLYxl!^X&wo62`g7GkL6RKK|$!{morpK#bkmEX~>{g(uh zPbPb#GIELCGD*VZmWn6wsO4v)qqiRyeo+XfgGCGICOGH2R^Pb4J=l5N!vNO*Qy#z_ zIQ3d=qUXGtmp0WVEpAEn<2DV`)Tn(U(axhca2mpS`9et<+t{6clY+G92_hq-nWO-g zd=HfJ&x5~kkrVoxMcx+ZBaz`yaZSrmr+DR0f7xnPb!CaNB;{UOw37wI*89owTmSM+ zZb*>jvsKS-q9UfrcOW;lcV!(U6dhi1sjWKcmZY=}jiA+%#IlgFv5@`Li!+<|YRvDH zCUJ%}I*?8y{x?{pU-O;Y^9}1Hmc52i`bBawzvp>tiDjZ IglwL&dAo834tX&^&aw+{v{nt#GIe6OiTXVV8NhW2!1W# z3&v5Fl;@KmBd>48^y+(^`DJ?fXq5gNpP@7#d&k;$Z9e>oWwMgzmQ6236SZHKy4@L* zj!l_y!52uGiX{s-Dnpve_tbAUWmpJRU%Z N$i9s1kD z{X>A!5Y(*N88y%#o|4k gEzp{PEMg46xC(NeaB?C|sv#a#vwZ 8i1!t*$G`-C4}CEav9&Tq)UP(# z*TS{~+>iPcTcW3FCh(Kq)Pglrne!K(FJ9)YUMj|75m{cnHf`iT478aqFeQ5SnDJx; z+~vz}E686{RUT`Y55HjK!6x8qcWiT@i`!Y`RGxdzFHECFXM#%_;qdkOThel3ycqaY zm%+Ka^e1XhIZCT~kBf_ocQ+WJ)JX?b8Pdgnu|Cglx1M*Eb6Cy{rS<=nyW`3@V2)3c z#N~VHDD+_z)AUhbLs-uypGK}-A(m91*w#ZfhE9OjVKB1If z)ZZMiXY>BCK!*KL3kB9~XxP=AagSN!t}`a(d^P?6ra$7I%di)m`}UV_u9QYxn3OQ% zzyv?zz`R!#%tOUHH!+ZP;H2T}A@qb%gi`0BK2d!X_X0%{5fDJkbvOOeHQ2wB{=PC1 zNtv*Yyh((-H==m3RPw)yUPm&itRF|D{4Qw{I*Q{W5ebHI(VWt*_P@Kg3l6e!Ne?Td zg8rc1^W#FS4Bkaq2i}Nj8wc?IO_@h*)lYtOrtC5|xhYS3b!iv%I>4oTjdL=h>-&Wa z*Q0M6QueHPUxdXe$HhPHcbWJK;At-B(D9XwsyEZ%aU{~Z^M6Z)#x5J>DpAGrDh6># z09E!{W~ft)q&j{}&$E9ly2bS&`ODCjE3Hms`VHVeygEjqHen|Tpf1tB1w2^S%yfOI z5(gIifTC_6nQq|R+xd==A(KE1l*mUNboh5%I6*ka9|`U&mb%{DWxT(krwahb<~H1h zNT|+Qgh U+QdwX*zvf-7 z)}+P=%IV{R^Y(5r2i4U+-n&p0?(vT@Gk$b0;4Cw`+9?XS%e;%8dKiBV2 d{H>2uTBRPBd%8+Jc|dUYc9Lp!=#*GmqIjRQTOt99( V5W; zfYZ|_h!?F}4KG`)NXKAU^#-$3-9sUSm@7~GL8Pwksu;}xD0U|Sk_U0v@Z$H`lW`na zVpBu#@gpi+7i@6=ERy|`?|sF#N_Tn4*zdDQ_s2-iRh;*XxMoV#>Qkg|I!IkkHLp9m zZ$pj?0x`{0E-;G^Ppv@7YGWJ-^^*#d!pcE1@fSgY7rY2p4c}GQOn-`dXELtUr#j*Y z$KO=%UzC8&FHu#4{VOX4_t^KHgV2O)T7>&5wI*ukbcbaO^Pzf>c#I?|u02Q@HQQ}m zs4j?@{`HmsM&eT(QvGCF@bm)e72`i0DqbL6e^V>pnd{z^P_4%|yun5!cJ}Ayo4VDw zQg^A36D??9j9t`A%$Q3**tN)~EMiBpjVF+N#Iw73h^_WK@)CZ1M|O?$?-Wp*z0{lV z6oAI%nPrdli-2NEbKt=3{Vd`USmlj1Z*^~Y@Ntok`nvWA?3c3s!|bGJr2LBdp=oz@ zOtaF5*~?x2lL%}ll0&Sce6XVbqn4~q&Q;+%9&XA2Dw6@dsmBrOn65Ofe}9W7KE0zE z$r7yDlARqFoPg1v01&pBuR@wN#6ni24m%S#*xGnd+#@S5J_45IJzkyYw#q~yrx9{d z*Pd$UhQSKJT+C%T)Z^?tF#ERpWo{ypkDF4Tz)C}5t5M^9kbi1Z9}op7whHm=2El6( zwtZ19wqg=b4h9_KL9#XDmN2|ODYIBt8Y1-Q*Q{^0Q&4%R&u(_B2Iz{qnMzDud(lVP zeO!F~2GRx7Qy{exOFk4U4DaqzJv4<^4@ @_HuU-m@bLJ84FQGktBz@0cL&L%@b09H z2vbi|QHBxwC)^Z8Uayd^r*YG(+Rqgio3kZKxjVBZc2_xe%72cje3 jP2l zxB@#;kO{_fpOy*lFjENcEPP_VATmjujPbF8WX&{%)lgg~gCtHRCMG|?PfQKz{5J1N zn`CAhYbfiqE!&z->R@2B%%s4BHW9lwkLH*-UQAu!)oEX%XCV`3sitEW9IBk~kv}P6 zpqspj9(1dOF`}=E?2}>p46Y%`8y}6^4UH0-2SnMD_i5|5bR&gN@qDU8%Ye!H+}}B` z2G7s7yc$u@jm|oa1nvg@`dMH=)4pO6)5QnP;Os;`GwfxFQg6sa7RpgHKI+Bt$A3F& zp+lF`@wMkwiX!g2b$WS*$ {=^T++w)@(zFoy8mkilVq{>KMvvF~iLVy{Dr1Ok)S;uac^s<9FzJ(OaHva1nHZtX zlcH!Fldi9m{~8&t{1ueSn5&2$;%=G240kzrNI%J$j~BA}tl;|-@rtD%2~(wLdE8|P zrlh<%nGK_#Xz4s8FVqWhd9rS*ZQ1d1$HU^%CZrA(`LGn~n(kzp4IMGVmfFN+B|3^| zAwX`t$R7v{=aawLsX3#qTd90b-pML4b0MjuELEs3BSH6ZZGokFF@w6wLWW_sTeeNm zJ`fgGnTaA$mVzes_7E`e=+Xs9|G2{trg@6=dnvyOL)w1v!R{@ eAv^HE1*3SXr~l zmMbJEJv~;@i}(OFpy#D2;|Z`#_+VsRprT@Z(@U3up_#HvjFs`5wgEuRg2pIo99i9B zb@oK1sFMt1<^SbGStrsW6ifeCh32fD$ZT`>2%+}ihw(AF_sft^>T~QI-LE06fgPU> zj?<2aLnlj58}`Hlvb20A)p?Yjv1?n8Mu+w0A2`5+6-h5bY#ArNXx6jAx3QL<7cr@c y&ZB6G)6R64BzIPbY-GNC)ze8(n)#p*rNtl!FBTf{nu$-GWYU5^U>*6tcm97|iF#)M diff --git a/addons/sourcemod/scripting/disabled/passthestats.sp b/addons/sourcemod/scripting/disabled/passthestats.sp deleted file mode 100644 index 06a1c8b..0000000 --- a/addons/sourcemod/scripting/disabled/passthestats.sp +++ /dev/null @@ -1,213 +0,0 @@ -#include -#include -#include - -//adding support for maps other than arena2 -#define PLUGIN_VERSION "1.6.0" -#define NAME_SIZE 25 - -public Plugin myinfo = { - name = "[TF2] Pass the Stats", - author = "easye", - description = "Stats for Competitve 4v4 Passtime", - version = "PLUGIN_VERSION", - url="https://github.com/eaasye/passtime" -} - - -//playerArray: 0 = scores, saves = 1, 2 = interceptions, 3 = steals -int playerArray[MAXPLAYERS][4]; -float bluGoal[3], redGoal[3]; -ConVar statsEnable, statsDelay, saveRadius; - - -public void OnPluginStart() { - statsEnable = CreateConVar("sm_passtime_stats", "1", "Enables passtime stats") - statsDelay = CreateConVar("sm_passtime_stats_delay", "7.5", "Delay for passtime stats to be displayed after a game is won") - saveRadius = CreateConVar("sm_passtime_stats_save_radius", "200", "The Radius in hammer units from the goal that an intercept is considered a save") - CreateConVar("sm_passthestats_version", PLUGIN_VERSION, "*DONT MANUALLY CHANGE* PassTheStats Plugin Version", FCVAR_NOTIFY | FCVAR_DONTRECORD | FCVAR_SPONLY); - char mapName[64], prefix[16]; - GetCurrentMap(mapName, sizeof(mapName)); - prefix[0] = mapName[0], prefix[1] = mapName[1]; - if - (StrEqual("pa", prefix)) statsEnable.SetInt(1); - else - statsEnable.SetInt(0); - - HookEvent("teamplay_round_win", Event_TeamWin, EventHookMode_Post); - HookEvent("pass_score", Event_PassScore, EventHookMode_Post); - HookEvent("pass_pass_caught", Event_PassCaught, EventHookMode_Post); - HookEvent("pass_ball_stolen", Event_PassStolen, EventHookMode_Post); -} - -public void OnMapStart() { - GetGoalLocations(); -} - -public void OnClientDisconnect(int client) { - playerArray[client][0] = 0, playerArray[client][1] = 0, playerArray[client][2] = 0, playerArray[client][3] = 0; -} - - -public Action Event_PassScore(Event event, const char[] name, bool dontbroadcast) { - if (!statsEnable.BoolValue) return Plugin_Handled; - - int client = event.GetInt("scorer") - if (!IsValidClient(client)) return Plugin_Handled; - char playerName[NAME_SIZE]; - GetClientName(client, playerName, sizeof(playerName)); - PrintToChatAll("\x0700ffff[PASS] %s\x073BC43B scored a goal!", playerName); - playerArray[client][0]++; - return Plugin_Handled; -} - -public Action Event_PassCaught(Event event, const char[] name, bool dontBroadcast) { - if (!statsEnable.BoolValue) return Plugin_Handled; - - int passer = event.GetInt("passer"); - int catcher = event.GetInt("catcher"); - if (TF2_GetClientTeam(passer) == TF2_GetClientTeam(catcher)) return Plugin_Handled; - if (TF2_GetClientTeam(passer) == TFTeam_Spectator || TF2_GetClientTeam(catcher) == TFTeam_Spectator) return Plugin_Handled; - - char passerName[NAME_SIZE], catcherName[NAME_SIZE]; - GetClientName(passer, passerName, sizeof(passerName)); - GetClientName(catcher, catcherName, sizeof(catcherName)); - if (InGoalieZone(catcher)) { - PrintToChatAll("\x0700ffff[PASS] %s \x07ffff00 blocked \x0700ffff%s!", catcherName, passerName); - playerArray[catcher][1]++; - } - else { - PrintToChatAll("\x0700ffff[PASS] %s \x07ff00ffintercepted \x0700ffff%s!", catcherName, passerName); - playerArray[catcher][2]++; - } - - return Plugin_Handled; -} - -public Action Event_PassStolen(Event event, const char[] name, bool dontBroadcast) { - if (!statsEnable.BoolValue) return Plugin_Handled; - - int thief = event.GetInt("attacker"); - int victim = event.GetInt("victim"); - char thiefName[NAME_SIZE], victimName[NAME_SIZE]; - GetClientName(thief, thiefName, sizeof(thiefName)); - GetClientName(victim, victimName, sizeof(victimName)); - PrintToChatAll("\x0700ffff[PASS] %s\x07ff8000 stole from\x0700ffff %s!", thiefName, victimName); - playerArray[thief][3]++; - - return Plugin_Handled; -} - -public Action Event_TeamWin(Event event, const char[] name, bool dontBroadcast) { - if (!statsEnable.BoolValue) return Plugin_Handled; - CreateTimer(statsDelay.FloatValue, Timer_DisplayStats) - return Plugin_Handled; -} - -//this is really fucking sloppy but shrug -public Action Timer_DisplayStats(Handle timer) { - int redTeam[16], bluTeam[16]; - int redCursor, bluCursor = 0; - for (int x=1; x < MaxClients+1; x++) { - if (!IsValidClient(x)) continue; - - if (TF2_GetClientTeam(x) == TFTeam_Red) { - redTeam[redCursor] = x; - redCursor++; - } - - else if (TF2_GetClientTeam(x) == TFTeam_Blue) { - bluTeam[bluCursor] = x; - bluCursor++; - } - } - for (int x=1; x < MaxClients+1; x++) { - if (!IsValidClient2(x)) continue; - - if (TF2_GetClientTeam(x) == TFTeam_Red) { - for (int i=0; i < bluCursor; i++) { - char playerName[NAME_SIZE]; - GetClientName(bluTeam[i], playerName, sizeof(playerName)) - PrintToChat(x, "\x0700ffff[PASS]\x074EA6C1 %s:\x073BC43B goals %d,\x07ffff00 saves %d,\x07ff00ff intercepts %d,\x07ff8000 steals %d", playerName, playerArray[bluTeam[i]][0], playerArray[bluTeam[i]][1], playerArray[bluTeam[i]][2], playerArray[bluTeam[i]][3]) - } - - for (int i=0; i < redCursor; i++) { - char playerName[NAME_SIZE]; - GetClientName(redTeam[i], playerName, sizeof(playerName)) - PrintToChat(x, "\x0700ffff[PASS]\x07C43F3B %s:\x073BC43B goals %d,\x07ffff00 saves %d,\x07ff00ff intercepts %d,\x07ff8000 steals %d", playerName, playerArray[redTeam[i]][0], playerArray[redTeam[i]][1], playerArray[redTeam[i]][2], playerArray[redTeam[i]][3]) - } - } - - else if (TF2_GetClientTeam(x) == TFTeam_Blue|| TF2_GetClientTeam(x) == TFTeam_Spectator) { - for (int i=0; i < redCursor; i++) { - char playerName[NAME_SIZE]; - GetClientName(redTeam[i], playerName, sizeof(playerName)) - PrintToChat(x, "\x0700ffff[PASS]\x07C43F3B %s:\x073BC43B goals %d,\x07ffff00 saves %d,\x07ff00ff intercepts %d,\x07ff8000 steals %d", playerName, playerArray[redTeam[i]][0], playerArray[redTeam[i]][1], playerArray[redTeam[i]][2], playerArray[redTeam[i]][3]) - } - - for (int i=0; i < bluCursor; i++) { - char playerName[NAME_SIZE]; - GetClientName(bluTeam[i], playerName, sizeof(playerName)) - PrintToChat(x, "\x0700ffff[PASS]\x074EA6C1 %s:\x073BC43B goals %d,\x07ffff00 saves %d,\x07ff00ff intercepts %d,\x07ff8000 steals %d", playerName, playerArray[bluTeam[i]][0], playerArray[bluTeam[i]][1], playerArray[bluTeam[i]][2], playerArray[bluTeam[i]][3]) - } - - } - } - - //clear stats - for (int i=0; i < MaxClients+1;i++) { - playerArray[i][0] = 0, playerArray[i][1] = 0, playerArray[i][2] = 0, playerArray[i][3] = 0; - } - return Plugin_Continue; -} - -public bool InGoalieZone(int client) { - int team = GetClientTeam(client); - float position[3]; - GetClientAbsOrigin(client, position); - - if (team == view_as (TFTeam_Blue)) { - float distance = GetVectorDistance(position, bluGoal, false); - if (distance < saveRadius.FloatValue) return true; - } - - if (team == view_as (TFTeam_Red)) { - float distance = GetVectorDistance(position, redGoal, false); - if (distance < saveRadius.FloatValue) return true; - } - - return false; -} - -public void GetGoalLocations() { - int goal1 = FindEntityByClassname(-1, "func_passtime_goal"); - int goal2 = FindEntityByClassname(goal1, "func_passtime_goal"); - int team1 = GetEntProp(goal1, Prop_Send, "m_iTeamNum"); - if (team1 == 2) { - GetEntPropVector(goal1, Prop_Send, "m_vecOrigin", bluGoal); - GetEntPropVector(goal2, Prop_Send, "m_vecOrigin", redGoal); - } - else { - GetEntPropVector(goal2, Prop_Send, "m_vecOrigin", bluGoal); - GetEntPropVector(goal1, Prop_Send, "m_vecOrigin", redGoal); - } -} - -//i have two of these because i have no friends so i test with robots -public bool IsValidClient(int client) { - if (client > 4096) client = EntRefToEntIndex(client); - if (client < 1 || client > MaxClients) return false; - if (!IsClientInGame(client)) return false; - //if (IsFakeClient(client)) return false; - if (GetEntProp(client, Prop_Send, "m_bIsCoaching")) return false; - return true; -} - -public bool IsValidClient2(int client) { - if (client > 4096) client = EntRefToEntIndex(client); - if (client < 1 || client > MaxClients) return false; - if (!IsClientInGame(client)) return false; - if (IsFakeClient(client)) return false; - if (GetEntProp(client, Prop_Send, "m_bIsCoaching")) return false; - return true; -} \ No newline at end of file diff --git a/addons/sourcemod/scripting/disabled/passtimecontrol.sp b/addons/sourcemod/scripting/disabled/passtimecontrol.sp deleted file mode 100644 index 1040916..0000000 --- a/addons/sourcemod/scripting/disabled/passtimecontrol.sp +++ /dev/null @@ -1,201 +0,0 @@ -#include -#include - - -#define PLUGIN_VERSION "1.4.0" - -bool deadPlayers[MAXPLAYERS + 1]; -//0 = hud text, 1 = chat, 2 = sound -bool ballHudEnabled[MAXPLAYERS + 1][3]; - -ConVar stockEnable, respawnEnable, clearHud, collisionDisable; - -Menu ballHudMenu; - -public Plugin myinfo = { - name = "[TF2] PasstimeControl", - author = "EasyE", - description = "Intended for 4v4 Competitive Passtime use. Can prevent players from using shotgun, stickies, and needles. Can disable the screenoverlay blur effect after intercepting or stealing the jack.", - version = PLUGIN_VERSION, - url = "https://github.com/eaasye/passtime" -} - -public void OnPluginStart() { - RegConsoleCmd("sm_ballhud", Command_BallHud); - - HookEvent("player_spawn", Event_PlayerSpawn, EventHookMode_Post); - HookEvent("post_inventory_application", Event_PlayerResup, EventHookMode_Post); - HookEvent("player_death", Event_PlayerDeath, EventHookMode_Post); - HookEvent("pass_get", Event_PassGet, EventHookMode_Post); - HookEvent("pass_free", Event_PassFree, EventHookMode_Post); - HookEvent("pass_ball_stolen", Event_PassStolen, EventHookMode_Post); - HookEntityOutput("info_passtime_ball_spawn", "OnSpawnBall", Hook_OnSpawnBall) - AddCommandListener(OnChangeClass, "joinclass"); - - stockEnable = CreateConVar("sm_passtime_whitelist", "0", "Enables/Disables passtime stock weapon locking"); - respawnEnable = CreateConVar("sm_passtime_respawn", "0", "Enables/disables fixed respawn time"); - clearHud = CreateConVar("sm_passtime_hud", "1", "Enables/Disables blocking the blur effect after intercepting or stealing the ball"); - collisionDisable = CreateConVar("sm_passtime_collision_disable", "0", "Enables/Disables the passtime jack from colliding with ammopacks or weapons"); - CreateConVar("sm_passtimecontrol_version", PLUGIN_VERSION, "*DONT MANUALLY CHANGE* Passtime-Control Plugin Version", FCVAR_NOTIFY | FCVAR_DONTRECORD | FCVAR_SPONLY); - - ballHudMenu = new Menu(BallHudMenuHandler); - ballHudMenu.SetTitle("Jack Notifcations"); - ballHudMenu.AddItem("hudtext", "Toggle hud notifcation"); - ballHudMenu.AddItem("chattext", "Toggle chat notifcation"); - ballHudMenu.AddItem("sound", "Toggle sound notification"); -} - -public void OnClientDisconnect(int client) { - deadPlayers[client] = false; - ballHudEnabled[client][0] = false; - ballHudEnabled[client][1] = false; - ballHudEnabled[client][2] = false; -} - -public void TF2_OnConditionAdded(int client, TFCond condition) { - if (condition == TFCond_PasstimeInterception && clearHud.BoolValue) { - ClientCommand(client, "r_screenoverlay \"\""); - } -} - -public Action Command_BallHud(int client, int args) { - if (IsValidClient(client)) ballHudMenu.Display(client, MENU_TIME_FOREVER); - return Plugin_Handled; -} - -public int BallHudMenuHandler(Menu menu, MenuAction action, int param1, int param2) { - if (action == MenuAction_Select) { - char info[32]; - char status[64]; - ballHudMenu.GetItem(param2, info, sizeof(info)); - if (StrEqual(info, "hudtext")) { - ballHudEnabled[param1][0] = !ballHudEnabled[param1][0]; - ballHudMenu.Display(param1, MENU_TIME_FOREVER); - - Format(status, sizeof(status), "\x0700ffff[PASS]\x01 Hud text: %s", ballHudEnabled[param1][0] ? "\x0700ff00Enabled" : "\x07ff0000Disabled"); - PrintToChat(param1, status); - } - if (StrEqual(info, "chattext")) { - ballHudEnabled[param1][1] = !ballHudEnabled[param1][1]; - ballHudMenu.Display(param1, MENU_TIME_FOREVER); - - Format(status, sizeof(status), "\x0700ffff[PASS]\x01 Chat text: %s", ballHudEnabled[param1][1] ? "\x0700ff00Enabled" : "\x07ff0000Disabled"); - PrintToChat(param1, status); - - } - if (StrEqual(info, "sound")) { - ballHudEnabled[param1][2] = !ballHudEnabled[param1][2]; - ballHudMenu.Display(param1, MENU_TIME_FOREVER); - - Format(status, sizeof(status), "\x0700ffff[PASS]\x01 Sound notification: %s", ballHudEnabled[param1][2] ? "\x0700ff00Enabled" : "\x07ff0000Disabled"); - PrintToChat(param1, status); - } - } - return 0; -} - -/* ---EVENTS--- */ - -public Action Event_PassFree(Event event, const char[] name, bool dontBroadcast) { - int owner = event.GetInt("owner") - if (ballHudEnabled[owner][0]) { - SetHudTextParams(-1.0, 0.22, 3.0, 240, 0, 240, 255); - ShowHudText(owner, 1, ""); - } - return Plugin_Continue; -} - -public Action Event_PassGet(Event event, const char[] name, bool dontBroadcast) { - int owner = event.GetInt("owner"); - if (ballHudEnabled[owner][0]) { - SetHudTextParams(-1.0, 0.22, 3.0, 240, 0, 240, 255); - ShowHudText(owner, 1, "YOU HAVE THE JACK"); - } - - if (ballHudEnabled[owner][1]) { - PrintToChat(owner, "\x07ffff00[PASS]\x0700ff00 YOU HAVE THE JACK!!!"); - } - - if (ballHudEnabled[owner][2]) { - ClientCommand(owner, "playgamesound Passtime.BallSmack"); - } - return Plugin_Continue; -} - -public Action Event_PassStolen(Event event, const char[] name, bool dontBroadcast) { - int owner = event.GetInt("victim"); - if (ballHudEnabled[owner][0]) { - SetHudTextParams(-1.0, 0.22, 3.0, 240, 0, 240, 255); - ShowHudText(owner, 1, ""); - } - return Plugin_Continue; -} - -public Action Event_PlayerDeath(Event event, const char[] name, bool dontBroadcast) { - int client = GetClientOfUserId(GetEventInt(event, "userid")) - deadPlayers[client] = true; - return Plugin_Continue; -} - -public Action Event_PlayerSpawn(Event event, const char[] name, bool dontBroadcast) { - int client = GetClientOfUserId(GetEventInt(event, "userid")) - deadPlayers[client] = false; - RemoveShotty(client); - return Plugin_Continue; -} - -public Action Event_PlayerResup(Event event, const char[] name, bool dontBroadcast) { - int client = GetClientOfUserId(GetEventInt(event, "userid")) - RemoveShotty(client); - return Plugin_Continue; -} - -public Action OnChangeClass(int client, const char[] strCommand, int args) { - if(deadPlayers[client] == true && respawnEnable.BoolValue) { - PrintCenterText(client, "You cant change class yet."); - return Plugin_Handled; - } - - return Plugin_Continue; -} - -public void Hook_OnSpawnBall(const char[] name, int caller, int activator, float delay) { - int ball = FindEntityByClassname(-1, "passtime_ball"); - if(collisionDisable.BoolValue) SetEntityCollisionGroup(ball, 4); -} - -/* ---FUNCTIONS--- */ - -public void RemoveShotty(int client) { - if(stockEnable.BoolValue) { - TFClassType class = TF2_GetPlayerClass(client); - int iWep; - if (class == TFClass_DemoMan || class == TFClass_Soldier) iWep = GetPlayerWeaponSlot(client, 1) - else if (class == TFClass_Medic) iWep = GetPlayerWeaponSlot(client, 0); - - if(iWep >= 0) { - char classname[64]; - GetEntityClassname(iWep, classname, sizeof(classname)); - - if (StrEqual(classname, "tf_weapon_shotgun_soldier") || StrEqual(classname, "tf_weapon_pipebomblauncher")) { - PrintToChat(client, "\x07ff0000 [PASS] Shotgun/Stickies equipped"); - TF2_RemoveWeaponSlot(client, 1); - } - - if (StrEqual(classname, "tf_weapon_syringegun_medic")) { - PrintToChat(client, "\x07ff0000 [PASS] Syringe Gun equipped"); - TF2_RemoveWeaponSlot(client, 0); - } - - } - } -} - -public bool IsValidClient(int client) { - if (client > 4096) client = EntRefToEntIndex(client); - if (client < 1 || client > MaxClients) return false; - if (!IsClientInGame(client)) return false; - if (IsFakeClient(client)) return false; - if (GetEntProp(client, Prop_Send, "m_bIsCoaching")) return false; - return true; -} \ No newline at end of file diff --git a/cfg/rgl_base.cfg b/cfg/rgl_base.cfg index 443f8b0..09a7177 100644 --- a/cfg/rgl_base.cfg +++ b/cfg/rgl_base.cfg @@ -11,8 +11,7 @@ sm plugins unload disabled/roundtimer_override // unloads the old improved mat sm plugins unload roundtimer_override // unloads the old improved match timer from any server that may still have it enabled sm plugins unload improved_match_timer // unloads the improved match timer, not used by all formats sm plugins unload tf2Halftime // unloads tf2Halftime plugin -sm plugins unload disabled/passthestats // unloads passthestats plugin -sm plugins unload disabled/passtimecontrol // unloads passtimecontrol plugin +sm plugins unload disabled/p4sstime // unloads p4sstime plugin // TF2 Comp Fixes sm_deterministic_fall_damage 0 // patched by Valve July 7, 2022 with tf_fall_damage_disablespread diff --git a/cfg/rgl_off.cfg b/cfg/rgl_off.cfg index 86d624d..8ed532b 100644 --- a/cfg/rgl_off.cfg +++ b/cfg/rgl_off.cfg @@ -124,6 +124,7 @@ mp_time_between_capscoring "30" // delay between scoring of owned c tf_passtime_score_crit_sec "5.0f" // how long a scoring team's crits last tf_passtime_powerball_passpoints "25" // how many ball meter points are awarded for a complete pass tf_passtime_powerball_airtimebonus "40" // ball meter points added per second of time a pass is in the air. +tf_passtime_overtime_idle_sec "5" // defaults to 5 tf_tournament_classlimit_scout "-1" // defaults tf_tourney classlimits tf_tournament_classlimit_soldier "-1" // ^ @@ -177,7 +178,7 @@ sv_client_min_interp_ratio "1" // clamps client interp settings (d sv_client_max_interp_ratio "5" // ^ sv_client_predict "-1" // does not force cl_predict 1 - +sv_quota_stringcmdspersecond "40" // reset to default sv_allow_votes "1" // enables vote system @@ -206,8 +207,7 @@ sm plugins unload rglqol // unloads the qol plugin so that it sm plugins unload improved_match_timer // unloads the improved match timer //Pass time plugin -sm plugins unload disabled/passtimecontrol // loads passtimecontrol -sm plugins unload disabled/passthestats // loads passthestats +sm plugins unload disabled/p4sstime // unloads passtimecontrol exec "server" // execs the settings in your server.cfg servercfgfile "server" // execs your server cfg file on map change @@ -217,4 +217,4 @@ servercfgfile "server" // execs your server cfg file on map ch //sv_shutdown // sets a graceful shutdown to occur when server is empty say "Thanks for playing! Please note that STV is not immediately unloaded via this config, as slot count issues would occur and lead to potentional crashes." -say "A server restart has been scheduled to occur when all players have left the server, to turn off STV. Use sv_shutdown_cancel to prevent this. \ No newline at end of file +// say "A server restart has been scheduled to occur when all players have left the server to turn off STV. Use sv_shutdown_cancel to prevent this." \ No newline at end of file diff --git a/cfg/rgl_pt_base.cfg b/cfg/rgl_pt_base.cfg index 7941d4d..4736ff7 100644 --- a/cfg/rgl_pt_base.cfg +++ b/cfg/rgl_pt_base.cfg @@ -28,12 +28,17 @@ tf_passtime_score_crit_sec "0" tf_passtime_powerball_passpoints "0" tf_passtime_powerball_airtimebonus "0" +// sv_client_cmdrate_difference "30" +sv_quota_stringcmdspersecond "200" // prevent players from being kicked for issuing too many commands to the server +tf_passtime_overtime_idle_sec "30" // extend overtime period before round reset to allow for more interesting play + //Pass time plugin -sm plugins load disabled/passtimecontrol // loads passtimecontrol -sm plugins load disabled/passthestats // loads passthestats - -sm_passtime_whitelist "1" -sm_passtime_respawn "1" -sm_passtime_stats "1" -sm_passtime_hud "1" -sm_passtime_disable_collisions "1" \ No newline at end of file +sm plugins load disabled/p4sstime // loads p4sstime + +sm_pt_whitelist "1" +sm_pt_respawn "1" +sm_pt_stats "1" +sm_pt_hud "1" +sm_pt_drop_collision "1" +sm_pt_catapultprint "0" +sm_pt_practice "0" \ No newline at end of file diff --git a/cfg/rgl_pt_push.cfg b/cfg/rgl_pt_push.cfg index 2fd323f..f6ca323 100644 --- a/cfg/rgl_pt_push.cfg +++ b/cfg/rgl_pt_push.cfg @@ -11,14 +11,11 @@ mp_winlimit "3" // unsets server winlimit mp_windifference "0" // unsets windifference mp_maxrounds "0" // sets maxrounds to 2 -mp_showrespawntimes "1" // show the min respawn times for the teams, needed? -mp_time_between_capscoring "0" // delay between scoring of owned capture points -sv_client_cmdrate_difference "30" mp_tournament_restart // restarts the tournament to apply above settings say "RGL Fours Pass Time Push Config Executed." -say "First to win 3 rounds the match. First to 5 scores wins a round." +say "First to win 3 rounds wins the match. First to 5 scores wins a round." say "To be safe, please ***CHANGELEVEL*** to reload all settings properly and prevent any crashes." say "Exec rgl_off or restart your server 90 seconds after you have fully finished playing." \ No newline at end of file