From 9adbe2171910d166179ad5d7963004aaf023d1c2 Mon Sep 17 00:00:00 2001 From: Jackz Date: Tue, 20 Apr 2021 21:35:54 -0500 Subject: [PATCH] Bulk update --- plugins/L4D2FFKickProtection.smx | Bin 5279 -> 5275 bytes plugins/l4d2-info-cmd.smx | Bin 7546 -> 7932 bytes plugins/l4d2-manual-director.smx | Bin 9430 -> 8324 bytes plugins/l4d2_ai_minigun.smx | Bin 9026 -> 9031 bytes plugins/l4d2_feedthetrolls.smx | Bin 30454 -> 30884 bytes plugins/l4d_reservetheserver.smx | Bin 0 -> 6088 bytes plugins/tf2_botcaptcha.smx | Bin 0 -> 5466 bytes scripting/L4D2FFKickProtection.sp | 2 +- scripting/L4D2Tools.sp | 1 - scripting/include/feedthetrolls.inc | 25 +- scripting/include/l4d2_skill_detect.inc | 294 ++++++++++++++++++ scripting/include/l4d_info_editor.inc | 54 ++++ .../include/l4d_survivor_identity_fix.inc | 6 +- scripting/include/left4dhooks.inc | 29 +- scripting/include/sceneprocessor.inc | 283 +++++++++++++++++ scripting/include/smlib.inc | 32 ++ scripting/l4d2-info-cmd.sp | 35 ++- scripting/l4d2-manual-director.sp | 169 +++++++--- scripting/l4d2_ai_minigun.sp | 2 +- scripting/l4d2_feedthetrolls.sp | 73 +++-- scripting/l4d_reservetheserver.sp | 209 +++++++++++++ scripting/tf2_botcaptcha.sp | 110 +++++++ 22 files changed, 1221 insertions(+), 103 deletions(-) create mode 100644 plugins/l4d_reservetheserver.smx create mode 100644 plugins/tf2_botcaptcha.smx create mode 100644 scripting/include/l4d2_skill_detect.inc create mode 100644 scripting/include/l4d_info_editor.inc create mode 100644 scripting/include/sceneprocessor.inc create mode 100644 scripting/include/smlib.inc create mode 100644 scripting/l4d_reservetheserver.sp create mode 100644 scripting/tf2_botcaptcha.sp diff --git a/plugins/L4D2FFKickProtection.smx b/plugins/L4D2FFKickProtection.smx index 2c21fed7148cf0b3331d798002384e5431818a4b..700ad9abbc16c8cb0862ee9189f983d0d907a9d6 100644 GIT binary patch delta 5031 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 B+ll}H delta 5035 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 diff --git a/plugins/l4d2-info-cmd.smx b/plugins/l4d2-info-cmd.smx index 11c8087f23076b6f203f3688b56bae13b355c8a5..27ed06ecb5dc6b57f6f18804b8b70da1e8fa051a 100644 GIT binary patch delta 7770 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 OPAbqp{N!%GFaHOwQ(y-G delta 7381 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 diff --git a/plugins/l4d2-manual-director.smx b/plugins/l4d2-manual-director.smx index 8cb41edac9c2d34c7ee880d72a38edd6ff170d8e..a3ed3c7de702a10daf8bbf04dacde6628c86d2f5 100644 GIT binary patch literal 8324 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 T9}{DM?VAr_{{eNB_2&H_*tttY literal 9430 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 NLW&3c-U4;N{{hWEqRIdO delta 8866 zcmYM01yodD)b@wr4@ilmh?Js)G=g+WNJzJI*U(bKa2-TxM!KXM1f-imk&ZzS29QpX z7F@%`Sl-dXEe&u{P9XP>k0y|d=_DSuZ6l$Evhz<78HY#jE?|EH0-5359H&qm)8O0{rW@2M9)6BSq8HYZ!0}OJ z!um*v|LI73x~Rv-$gb34oRjIneCtPm7GSt$vSN6*-4Q(5O&h*#5>l*whDUJo87y1Y zg?hG6N^(^TMwWMZaPI36#EE|J%mHJ$_jAFEgzYKWv`dt0pN~K$w~K;n-_kI>}Wz7+KcUu<||N1K2}*=^;%(IG9CyDV*lai$LZ}mlpTF z56M*m7{KkUx70+_{Gvd>qNvN2CO{jGD~FJ@tHZIJ`-NcH!mb>>r9RrTuVC5Af32fQ zuA;yIvbf8GdtbLYA4wCS2yf!rcPGf!S;7rNOb}uUx71$Z=iJXEY4VPFQu+VJX!>_$s7bD3z(`#XkTP-BM07dZpy~1B z*e5x*L<^-PvT*;rRPZ$h~dd6SC%5mxgjN!wwg3_Sb#usf+y0+8;=P zdMjheZH-wCDQ_OCf=X|aKf>rfTNUTCrD%#=;y)_Q4(p@cc(ev+A2_FlX-zU_YW@5# zI5cs8EB-8ieW@;lN`{RpXNCC8Eh7xY8;Ob`KC6HI-SOHi6X6e*VM^Q==Q&6>c}KD0 zZ+5|sV4^s>Azw3LpYi6zmI~8(eM#~R`Gsyz!tM(n#%Zu&)}7awvXmG8wv}Wzy=4d_ zDo*o92=7rsMK^&8&H@=($<*G3h8AHzHP{c^4#b7P9^1U+2HU(irl1qK>=QR{S)b*W zW;Crl*!)|0<@t>Ai;+Y(yAKnD`I;6ysaLbAvuLA7mGUL=*jeF2I#fo`Lb3DOZie#0 z%ZYwTsh;*d@t0E6t>U_)eh}sp^AP5(Apz{kdf@Tiv=lHtlHomG7Uw-4{c@ce#eLY0 zHr%R*r#ifL!`FIsXpyeCkQm2Ei6%J%c z5Az?8et{{NScCadEqFy@&z%oDWr#7PRG2ptYvv+Qn}x~b1WN&^OFNcxV_RXhJF97o zF>duB2q2zWDo7q}amWu`E_LmI-9P&7h#W#`r#u>E8&q@?9Ww03Bxh8Lv=d`o(--H5 zJ)W8+k6(6zG5o7RF0-z@LI@Lrfc~TO-oU}M)IXvqcF4Al>PN?xxCO8eQ}MyMn>$Cn z(k!?HR&LGgBc|2#qd*&AUf)!p*ieH=(q=0F2*t&-LM-W46tt6tKn9v7TAX8NvF9jS z=%|2U3zqHh`5y4?5glm!QBJ$8|JbKSi70qpSL(qr@$j36Xexgy zmw^9_(2WB+uTYLj?X#`*k^b5I(kXSjQEP8ze*rW9&4#FJd+@s#oH4lAOZza|Umb$-}8a9ot#S459EJfm4RP+QgO zttgacrNHVux@5bUf!KaBR6iY=Lj&ubZvg$PwsNq zWV-FELknce`)tZy%M1tK{Z@xB^Y_YxC;aO?{?!7N>WfKebRqVx)@ldAIJD0U6X~Vn zL}4)fOYbUf(LQk>bNC-hnIpi^yf|d)Z;)ZB`*iQajRaYQL{zJOO-!~mi_*rl&#Zj& z3-w(-L|M_WdZX5dY}EQ82{2h?F-zgJE>UP~8MYA7z#BL5QKF48&u6Gm{7dVnIp;cujf@4gD(ueaL>U^4Q#PncL3~GM1__XdKM<3 zo2!LFi{>4?v#l=0fINt0_F+WUsZ8 z&lx#A*LvlHsZc6Ry4@yK=8ZRcAEoxb1ewS?3??kM3H>P0JUEL(v-AfY$KEw1=sTdrQ!pdy0R z8Hzmon%$e4-6hb@MZ%+Vt0yrw?NKt+?LU}7gVB&l3;tb$lvqpZ^hF6;r-y+HC$Dzd zX1Pm^k3MH~~?| zc*V6*Fi~|Q0SKlZpJ(WA^aOr5Iq!W~8V#Kz*Aiey+^0{BAlDLN*Q!kFEaK+pd8v2) z%kGb1%)qj!7`uJPmiJby%BIqtil3w5N%$AWKdX#!raji)|SVqh* zBmImP*l)-!7O2J9w`L(d7X7>68?5T7*521IENhO>i{2VSOFcVU*-Ozx;vSD=@^?S* ze}qW0Zvh^8L4jh3t2P&wYFkuQeo%~;^j_lWAnwPcaz?OeBz_Iv;ju2+hv_sm|3YPh zug(5mm{&)gHxOhYMfzQ*ufXLL8}aCsU3n;Ph=fzMh)N3|M^S5kNWaov;!m*aWZAD1 z67*^i!Q|?*#l`ZkFspBpONZZjWJYy1WKHELfS%49C-}A6&pz*K{Tpu?;TmKNlHf$K zce`^(_PpCAr}@>@U8?M954ylGzT~j1)-?*r%LaBg>^2+arj&I^b=~Yj^t3R#QF^Z< zfV9 z2S=6cK`%5;kc`DGD?w>)1G}Ef=MFKD7LS{=M&m!Tb*8)x9pzc~_n+4wxDJQbHIJ*# zAbAd<7aCKjp+dno11HRPVzDN$FX0982dis#h5KS$>)xK9=VIDBTN$Hcu-54J?dg4y zMx6IZ2t(lwuA$bv^cJ)hP0tv~US7Whu(J0|v2u3OKxowg2VpU}_iaOA9pSh|aWfqx zHQVF);hR|F5KdR$4fxu<-}X|1N&O5l@5v4V)Pp<)QlgqTyaUHz7?!^g- z`tGbpqnXJ0*)rlAHibS|%f?gO%u?gcWD}<4VjL>Ig5N>fV;k$Ut8BTD!f%C5c=)`> z$L2{f_3DC;)sseQwu3BsY-u73AQFzh%I;+~*EV_)dHPA9ExmU+zp3wN#Oop97tK_R zDxwlPWxs7P?nwF@f_>AaOSok*4#`ARF4D1YHGfbIaz_tLy(LXNHt)5|@;|IUk+CY% z%v}`No~gNiuv^xi%udPqnncO@4RWjVX_khg_-lg_Vg08$qqFCKWagr5OUV-VG@R@won(v|-;{?jgbnusyI=3o5a%Y5vmp8F z{?|5V#>N*b-^1L5*zJ-89|09H#Od}L{d~6h!&_@L1^iywXPps34(M3 zaAMx%e-`4(&04I99g&4I4q8RzJ~F#Qy}BLyPtuu%awv*dm4%v~i6+hGOye$JnG@jV=`r3< zNVqycd}Lp{b*5e2UpneIH9TB6`rPUG?hm;y0|7-g?=NGej3A-Gf!(iqbgx^ko~-Y^ z-m%4FFMY#9kR==lK(A`&*-|??zwx;3IH5}g>?QOJ*fvaIu4yreZ9I)hxSL}-# zjGoHarDYmCcC_^>5QqCjq{RH_zA;v4FOz28p2z;Os&?jo3C~saKuy(0i7#D_{W=PH-O_>rGw6B++%6<&S%tL}Kc8$b0`HcO59$Mv^4E8&z+zNS}{e8Spu zjw2uB>ruYMK#A1Hg)_$I2A5I>P>@OXNmR+OwDRcSlm&2h(+)H=t#=5o6Aw# zyoN>U&#@elT7=Xkfp(k34%dim0=XYLOq1BMOs`KIx66_ibGiFP_8WZttSCdMY-p!d z47EL1l=$H0T?~(p9;=P)EToLxjsB82^f2dOw;2rW0x0HPWT>U-=1HG=M7X(qbgmdc zI;=`sNw^$V&o?I*r?cO-#_l>1EZSsq$m7YEeQgxHy)hP|^iMjttr^LcKBH_st66A| zzy8ozaI3>0f>`bhDCcJ)SY@gGE2kl%B6;lK1=+PM9_-NAZgA0D)WH4q-Sd(8Tc7cI zMV$V988DPkF~Fi_WkgRjqAb$VIeF^@2{wRS2}0T}A|Kp^7Kx?{=my>%&NdfA7Dn0r z;uSj(G#--uVe~i@#StL9b3=kznQ#LOUp;e-| zlm{J`E^M2#!?%Y#VWd^}mxBnZ&YufIh|Rc{XYUyGkwxJryx+cK#sc4_F++8qylw6T zq~EVNw1d&8<&51AFG5|Pnt8x0=GDD;bUmfX(U%=Gh?NOX7;{y$CyW}`uoVyOY7zC& z3!~w~`^%FKGHBf4r=vPtJ+nU~j`Vs|`WXCIrt!7lRj1IwMJ%UHL&gjFvB z?oFDLhAFtBKj3RB`7M0wicX+XruG7k+&LZX1R-NG8MdFt8S{3D{7rr@#*fMqFE=b( zSsmT@K6ZCa-hSb@*6`mI|HrQ>vT1_#a%VS}-Ea}^PzH;wn0WHc+mH2Kf0q~nYOUF% zz5}083Xkq_&KiCi!q{UfZ~q9{|dIOZJ~fOjK!R2{qYBJ!R;)XZlAupe(R z18Xdf=6&lho(QJ1_+G9$98O1)D^u?~7i{|yf<5&w5HD|K^K zQxK+-xbkVT_4@*G_b~RcZLU>SAlM&pea!9J)B1M#1P&Q{P&nN7IJ}-DdmmF&d+#!s@GuFA}ds$=IQ@~WC!O?7(wj*%A#JA}wf$FL?^YQgh2xkR^B|l3!#1Y+1VgI$pDs3mi z9=jW}Oh5CvPA)+5r~f_Rk}CLOxI@Gz9MY#vbq0X|PCiEUFm>Um)@jmf#osRG&U5AX zoX&;A99zTkzn)Xs9WBhgoB{sR|6~k_>*M+dN!A?2MzZ?^q40nOlSLe$Fwc8#~6qBrKxA?-}6mww`vJ!a(hup94-6TXd{ z>d%RdC4c}6Sd|7RbaDl2unuD>7>JyWP~>A4cB%2gLR&mY7kfa6R>4&Z>oMRU zPu{q~PaMdXkI(2nw>6aJ{hmwRPC`S8Zk51iKsqL~;VWZT4hy-lJJutv+sW-g%=?S< zLN?dq&_#D+y6BA6U4c@$w@sUW=!8mg#mOGdWDAM(1?3Gzkbm#4tbs{c?5a2<%46{p zgL&eG-lQ=!8Ibi7QFj2BXAS1c?15joM+&;vgyex!N^XHkJsz)Fq}k@q$S* z*}K0`sdlEGgw_g5*Md4LsMaO#b}Bg$7ae3_85V z5(%Y9c2}M^(FLa))Wu~~$>}b?mn;x#&P3i1j7fvuXPa?ZsG9&xOsDOr;Y&dj;^y(eI9S`qG zK)MGdd;10{^BOtLpo*XM8Z)7VMNX3mb$iE1w&6(0_DDvy^Hh}3r#chv(J|W_*>5TBai$6I4>%@tNc7FXQ>vp5YyB$t-(rBJq3`R$ceY7RV&$sSk%q7_BpHv ze&_kQdGNU8fkWW_6d8ZbQIPuiZ;GoQwW-Km#T-1q@$A_pMH8DZ;a1;{N-hQb+;KZe z*%FN2$JSWFWe7qrHL2I6$Go1>w_c~u$NIW3Jk>QwcqifBMkQyy@C75*cKF$;>=;(g za;ab^9LS}prQJiKZth&r2UOj?raV?3yZ;U2bvYv|pYG=~tQ!20egWBgL(=(v@nIe^ zG=$WKo_h#&Lu#XQYN^&to`2P$N(|J6-l%G@u@E3B6lDoS<$oG|8?ik$8fQdPVkLfh zh!@6VLKk_ZQ3td?!_RqRujqp@O2vOr!MbcYz{U~7xd>1m?{U!|Bs|KH22mQsVSphp&3G>dt5a8_OQfnYfTR@ zUk(W7q_{9d{QY%b=7x^bVr>q;5-Wzm?-{+!Y1;#&x&!$y9`yZ?;Jhso;@E&+v8)GA zUP&jPXX!)+S^5Ey*YgRNm=9DJALp)(1{Xg~9Q-0u-&b!k`iiR5Z%Y2#pnLfx>AKgN z`$U7dA+s1ZrncNB?eMqFuyfn+ugYgYVcErT+$mzDF#Z<$-1!IK!5;g$hN}GJezX5g zjFzi3N)iN&a+r_WK6%yL*-u$OOc#78~EKh>Gsb!?;hu>1-?jK2nq5qG`G!S9)=+|A+BLP%Z$3SCSoL z#PbDQ7OZpmbJ_8)=}ZZ7ZzCxE--TqdUE9#?)I4VJlF^O^6wcux6zfD6uq2j0(VVhl zfbu!q;^jHK^M@g+%3s=C{(>vH>Z8r~vWn;M8`42U8#5;$*r1~&7`uZncT0;~>4967 z`ER8PZq*>A#V!6i5zx^7;Sm2?D+wSp3909il|OgXuHWmH1EO%*2ZI#HNbQiuCr7d*HzsyJ(fF~sS90io%Eu}1s;=KVXMJ;%9!YSV zC8q+HA+Ik>>SXP4dM!2uRohY@78~OY$S6s2cpGCDCK)0l-~(aQIfOX9hRZ}C6@_{t zXwGOi#f#}-Ug64pW`3SDN^^Js#5U^ZJ(llYT{Hy@E9J}2^kOv6DoU|Fkv2)+%u6vE zf~Kr{y4n9-2*jaU>Z7_Md=Q>LTBI4h_Ly+ei4#MQlq|BWM))9mDL3;OTdKmfSTRa1 zgPeo6I=Rh~!JRRNH1UC7^Oreo@EMhOzUlm6-sH5o6pJ!WD2O2UrU7bbR4CPtB2&q7 z#0I?A#IEv)v=Vpv66NJ`*7~i^ENPqdHTNU7R{!rM+yeCBc$^N!YncRKZ8BXqBh=V;({d(v>1gx ze{P`F1lVGLhxHP$!kf8#N!q`V^G5FU<^o)cWx^(O0LvD&SP{~Jg(kdfzA67lGnW;( z0KxkNYH9G=ud^XzC%8Rh=PKT%_K0oLZj;|AF$;%KiN-1P+NO39!NYzDvl6Txdv_z6P53YCD>&n^NL9N?uHGNw z&-<5~apDhax)%voXSxzCo;F;S!zjL@Ql$d*t!STHp$m~x zLTQ4XMf){K3>XIbO-pi1`vv8FD51$;qUWEQdX&018nzKY+vKGRHc z^jkY4p=P>%AS1<Ci^~n+?lY`9iQy`_>NXkK9Mi%X_f_# zdp8TtV+^Op@1~G!c&3C(mka zGY#XJwvCnic2=I5q8D&Lmi%zn$mr9Kk<6>@nN|5(+kh2PbWKyJ9kN`ZJ|s5G>3Wv( zvE&r(V@W?@#nTEd4L?`Cw4KQVftiYBff;TogCnY(@^ieL^1yVhNx*D#LR5B*TD*GS z`ANOHkx`>~3$n3k@ zz(BmS+$=CFVWfEl*8|kmtvvl}&bdoZe?MK*pfr}3%?dFkymVH|hgF3sQj6CN&IS_y zG7YU(9QMo=YQ6|{wrVh9szw`+LpGoLT~Ld?{*phE%j{)E+V|BGJTj3c#;P^%_c$YGdP%cs0}zmDBoFdi~ZUoA*LW7wO|oDQC&yL6fKO`(Zn-MX^FT0UZW} zdGf>PrZzdfe6rET_G$;(V?O7)*GFL%f}|H;>Q^09eKo-_{-bS6-*sWqiyF;uVxD?c zD*6`uwf?(2**?INu@#d?aO0=XH%*-rQRTtWq{8ZpL{?g~kn?53&n6etd@Ao(VVpr%~W89P| z_1_68;~@hCD<(lq_~T|P>cj~+6aTLkpSKts~qZW!gXBzqH|d+nhmZ1 z*?46|p~C+YACxksYn)BW=&fQ&w6x9uuJMgQ7I+ZupL(0-A4gb;@q!jiH7OCnj7)OC zy{_kEE8Fxks*40m(?U^OVacLUAJKQ@Aj0h@4T1WzH4RC5eFT1KQ-ob)!()g!71my= zF|Ud>pjQoC!%AkD%W^UnZ$KUP%=#F7{j%A)_B-M0NEyPVWaZ2fuAdw_`O29bgxh1X z_*RmbC$8D4rH3U&yY>}_IX-ZQWY6v53b>}H>HGl`DDfot3w3!IrSb87yq!;Sb!zD8dHqMS z^UFp>!~zGCnp<~y7iY=)1Gg=EDz z#bAxs*jV*=SXg2hjKhbGwe$!JOA&)tgs`zTaj~#;Ft|$;qsM&L6oa$Hv9Z`N(&;~X z43@%3AI!MNV1JB^zzkmrY^*YjOvVfjN$mgXaxl08gR3|&95L9;3LEPQM%H15D+Y68 zICo-jx(zm#17_V(492y`#^Pec@U#Zn*kbY8SbA7u@qY2Na(1wG|1a>e{E7jtmL3jX zw*Lh#81dD^!{L8y|BGB~J?w!t|EvB#)Bj$vb@g=lU%iLV7h4-!yZ>kAZtL;CGizr{ zclZDQqMd`SGsYdSjTL~`&cXRV>;4BiJGlNIba1r;{*Uti*8Z;rz!_*|>HL4@K6frR8uO33&N3rz6T@krG^xaQz@T2JyvE*A1DF!y&TJ zp!(2ZU|ndupp((iq-I+7sd|E^+(E7N(Dkr}XW6#Zx!pPSsK&S<1L=Az^4Sr*v*eD1 z+^j%EeLgNDcF+!IZY!`0zAU%KgW8Tsd!ne2r_H%0VVv`{pkPWJ4f+SE*fP`y~g=JWaVaW?S{LHfTxSx_&akgp{xT1c;UZpBNWAk1<3j82>BWa(FWi7 zFeGaKLjqV&NN)Ha9>`ikIDkS1Lj}VlP4SW_8l_9Uwu7N>_`UTj4~9FWixq+)G|wt! z_utL7D_&YgqcEGDq+X-p=`z(f9I%Z360Zm_mTj+8iZ)+zGyBL2 zn=-`XwJS>~Jz}hpNqqdhzeqb!k_y_)cF6(%4)h`s4-K3pYKb`^3q3Q^PJOS)K}BrH z;sb%dsO60Ir5)~Ru?YDM$#}EU7!|2{k}E$p{Ux?9JavVE8AknNC-!vg8``SHsb0cz z$yJdzKZdTALmC`q2_DheesT*Y&o<3-ZB>-E%^3Out@u#{^G>&yEb}{hYh<2Gd@W*d zCI{WcH3V)pUOUzMSmrf<`1i7SOy&!nkBT_U%~s+rjcOxl(#8haQ)nnz+G>TaJq8rt;`#=( zt7HrQacL)o;2&X_qds-JJH&Uo`rD8z5Njwo1nv4Y5q6t;pE5euPDrJDlX^MAr31XE3(xvN53e)4WdMdO2;ROvYV6tDU@9Gc#g zv-7^;dJx=8ZV`{0-w@s3>D`NB5>BXK?Jrr{(DualgdA)pM}x{#Qgo58U5Jr#WtA!t53GU0eW{&t~vg%z^_!G7-ouEC6#4TI*Yg)B78qFKoasi`FweE(^}~x+TZ~|3ZJ!Q5w7BnzpIS zrxcYZhpq_(Ni89vra`u*>FWNT_CLWR7R%P`HkB_lIT+(MMn9xx;JL=~p^$`idvY}O za=C(WpXMn93+QkP^64gun~GkX^gL>sk1~1gac~d~-@g>!o#}%?jmtban;S&8XVwev z=1Y18&!wL|-@i5+1pHVMljPM~)pD-6zw~w?Y5uZDaS$%E!+Kwo5w^ODBOJ;;R9y@-Qlxv+T2xXsQs}&HpLmG z*hr7`)El|!4xW+xUJ+q^7BMI>n=rp{-DPRH$V4siFVuOW`S14r;$T@^YOM%JVJxt9 zVB@i3{8vJ0AWE-XBi>++IWZf1{Ewsg4&8PIpWvO5LP#FxAm-M}B>B=tL};q<(;73C z)=<~x(wWayjJ|Nc~OTk&&*oPMWzw73@tzjy)IBWz=pocN{lOwBZ@R80#Q+} zYErCyjg@_6gBOQBXP#J4`O{|9+4^C0$NkJly5KPBkm?4fPogR1YVRy_WXptSNL*Y_ z{IkgLnxK0Fn5pA-nR((=`{-GD;5C`GSr!SsOu?{Pj@d}Tx{Z{v$a9{z1;D2#F4?=?d~Y^nTMT_IfRJv_9OM*MJ#7f#_lHIT;4f#zqH;2ud?vw)62~ zhtqv(>bw90==0|d=K;;TY%Dr!T;$;*uvQmilF1AJIIph3#Th`ryRVt1Rr38Pz+4&` zBnJ*n<$6cC7I4|kCzwhGS?&k-5j(GvLC3n5L{L@oA6!=dk={pqUKosT>v42hy}Lul zRpB#$(2SAQ=OQTjY+3+@$iwk#W|H|1NlB4WuelB`t~6J@q3tXf_ z@|70~>o|f8GRQ337q{4PGo%mg3UgV{s_y2Ksfu-8b@AOWcJ9$@mHNj!-;vSiz&M;? zmk++%C>z6H`Ems?sLs0m4Q65hE#B|K4GPI1fOy$q3?bco>E#LdDwM!X;ewaeDjs-@eoL94?{eDs{b{MCc z^h$Z{i;DEUIhsNu`wYv;q|ni_wwR!V1(DAz_BhoCdBZNHxh-&kE0@FEcDP8bht|ZS zsvuE8nJ!E+CF!37a79qm{^wGQK-|jaD;`9?5XDN;A=s;jnsMV0lbn0=m?{CUSGcDF)h)A%diP?^zyQjSa*LBC-m86?%rvo;Ik>uSxl z0rr?Nz<6FR1Eh?}_F)f&R~P<@IIVI~(PFhM)-1l+mGRbLFd4)=2GXrmw3yMzJ72>?~&`3cM#W)DaM;aHxV0LWKOW! zd=(kQDOLL4=v+rM8rnUI`GHD{4e?^?YIjdi#4cP5&IB06@jGz35J=QxYcXp{m(?tvQ__RRpvJs_%%j>M?|l<0$&VI5#>CMR#gz%WRY0J85gOqbsv?5$;|?6#STDnIH$aE2*K1G9GqcVHwpd$Ph-6IJE&c1 zo+s9lerdJEwI_Jl;}LQ9S-+ebcox|ywnwS^(Mjx7uk|BgbC2 z#)NzNvmB}-lwq?CMGiV!#*D{YS}5-tVE*kZoWj%1=-duA_;f{0)|?g1gC>@h zpwd4NkZydRS^Du-A`2froQO3Y|*(Lt{bBZUHdL`y~M$UvLL}f>mLW=^jhNJ{)bF_lA=tF%uB1=pA4g_#Q~fF zYX5F?P2V>>FPn@vH4CTP+nHR#r!#o5uCqg?=jg%6TL6jH+YdN8VKFaKT~W&E!RbX~ z^&46gLIXIW!621OzF+71a$#TjVYp!}DL7ES;Fc0FbHD!noy?RF?JQw?U3cl(-sP|T zgEKJWtc_Uoq2Q%YNzLC2nSc5_10U9KYu^Nn{M{OPa@u)y!&@oMSG4kL!K6IrdA{8_ zLz8UVa#Urb{{4-q{vgbtGVdA=Y*k&B-wL_^ymvA^_eV)KckS~wK$jnmR)G4Hf@SLv zCg<%%$g31E$3 zSNIF?*f(n_@2}6+$+f--Jv#2^=%5R`q@)(xzoMF5h+M3jAN!*dHsD`ATA9{6T+1go zIyz4!3C$4AxODw{5)ieSs}zgY)(5Fn8?(cgJ0{#tTvngWb-W(=HtARl!;c2l^BPi% zIhxi`W#U?yrEZiW63)c+_6O9MZtvDoPBsG z4XAag1J2ksAccJ@XS;_Oo!(bgd>j=#qz2Wvz+5ix8WwNnd9Q*mlogt?t_|voq-yDW z=VVN4Ox|i8hSv(6?HqhwJQ?erae%{QeA@ecI7|l}V>K=&p~}gU$=_W(2Q7@V{1j@N zO+|NMdpw^HGs!;4UPvc4n;G1P(sl9LYgQh7jQ-l+#l966sqFi-dM=v+MK*PN9>IvxqhcWS$2LX_V!0E$%SDVOC# zU8>aTBKM>}rK;rcwP_FQn-f8qw1n!|$-$Y-yXWGK=dyot7Q>h)7rMFQGt{@Kcn_G=DpTEL zRTf6G876Q3H8CgK?zTU>H}I7WeBUF4c?Mh`eCvN0|FU)hw!#`$Ryjm@C+aA?hv0N~ z9CMapezGy2JC`>f#pB~fS0CtIN*$QOlD)`OPH(C&aP(Na$H73;Q}=Y>?O?v~;LBMy z@>0KN08 zi|NbQQ6O3d*H>)+pTug=q^Je>WHWZv1aUEox+P*7$oP_55%u z9pX)*bs=9i^da=C7Gf>F&dJTr+sXp6xmE4eR_1cz&@y_?;mvWVGc)^hM6JD2vyGwi z@UgslG#Zaux#ZSeA1fB^y7W3AUmfv#S7fSMXKLfIt-02A$;$LNP^Hnp5Y}Clr*oHG zJ}t$zr$3y47HNBH5{O*$xd!VYBXuV&vLqz#FU^F&#SpXj(hA0Hh6@uTOu2s5=}++% zUFtvcep0%13C*7sm}=3eR@sPj5)-FfwJ_}(k{SOb-?~(IDOGGM>5?qHg*Lb#kQ4o* z`pTikxnQt|rq6F(aE&R`5{zUXioav1uTj!KB)SWn`VEZIBhqz|X-UEXJ*zL-W_z=6 z9?HHFM5(tMmo*Pcvcl4qvc6HaO}S}Bw^C|Gw=#X zjU*CT398utIwFChsfnAxF3zoWf$K%l-LPe_>-wc)A zEH*XhKGgwB_FAv}bd+s1ybg$UP4dxP;VDFLA_xoNooR_&{V8uFSRLc7SpsAXS(!;^ zmjmf1oG%iqPBJu@@-~?MGzL8<4wU7*Wa#FlcGx&F>rVf@dF7A?rktSHoaHhiJ2EaD z*c<=iYnHf@#NpHHyxEJ^=iJqe@0ChWC8%#fe`?dO6V3bg*))nY;W~7Q>(kEP&WMwn zx76ni6LOk%zmwouezhD2zTd%4+ex|mO*B;Z+B=h+iq|hG9P_nv#0UaSZKiUn`_rCk!_TgZ zWm^IiymR86XFE0XY}?}zADGVe&;haN`D+o%_A4u2aBJqp#)$*C<(~WIa1NQ)*v|^A zt?oX`N~4B;^e;NhNi*vc0cL|nxv4$h=xuB6;j+%Qxlo{kq^`lrwPIvVm8meGBn z>w}AQ+&U$DHV{0Uw-yZ)GCB!VHY!7?{`8+_fW>%Qxo_W83&iUlNA3wOSh5ZKBHy;6 z>5e$3dF3HtSLugBEAT8;Kx&iPuPf=U7(=+Ubb^%huPRQh>6-GxN7m9pM?}RgNL9y! zsMM&kS-!*T;HDm5*8P#2#3A7PzoP5U3^SV7ilEr1u3nA#%luP#kL9xo6rlC$tszg( zy^^a{uzsE@t3Pmh5}LrI@b<#j#NV74a(GNTyf69@a2&B4{gfiEX*k8_jV>Mg)(`4z z$jO+p&-t6ZD1VQDx5|v3K z5yD1*sj$MZ2qoGOz*BJiDWbK1)v%<%GopF`-Oze|aI4cFp!b^D=*l7GmnzKHXzACUNj{$z=bl_~*)JPlq}*6I9#8U=@ecI_x9_vSq)m!da)7h14n+2| zQh9BmLX!gf4H@GLewAkdE*1+&^O(Ka5X9#@Hs&XwzkKhfy<#6Sx$iX9;yb-3Mv-*I zPG@4U9C$@<$xRt8;z^C!1IAd{YDvkU^uF zh_yyi8LRc^p}-r*@P=(K%`(3%-CKsSpVALa4SHWR&s6jCN>gPj;@xc{oQ9r=>K=;^ z>U@#m+!f;-rM664h|BJ;_maA4n!(>uWEi+DpW*psU@XZ8W+ru;6*xloj=pJU@zPt` zGUD#rem)K*7d-N&tzs%-o&_D0HOU)GQ+B`vj#S$7sc+1tSw63%9&O*e8V~F#Iie{( z*Y02M9W=_ak(hT4ig!Gs_IvLnI?tO=mHscwmbKBmLkFV z+piiGj=6f!$&S`LoXU5~HI=^^`fc~+&zU^`-=~q-)+1l*W}4rl z*rQqL>QXKolsQxV&4N9@hNN*dlUUj`@1;xX&kKtt?r={POdgUHc03AK>`uMfSst(x zWGmLHiq1r=v#aR%q)P61wf{i)XiuQ_1I85uThfK*}$ z{UG|RlE%q;Qt>_!cD#IuHo8_c(YdYA8_zqF8A<>Q{BbxXTu18ovn)r~1q>!ApS9Ec zU0K#{R%sW_J1Ldwo4vp`(90&L- z@!)H$kbLvntSoNes1yh4;@gY9cAWK}c9vnWa4ie+lQ0ImmQ^+@L zU_PGNlwB+Bji_sf(7j!2jGxXWQPwgSI3qV6bflAGKshgOT@NOY&EI57bR)PJ6O*nE zzr0yzqQAlObKnCGn$goh+dkPnn7!HAT^YV9M>-$#!kE(ru{=qOok+h1?z|6!9~-

tE3kPwjP__gMOIE(nc(5%@M6;5T)R0(z`gs2JSEKXu>z#?yGQny~ z!B9FhqL44ujVH8HQbyT5eo3vLXcxP)owjI!W+!{{FghehxY2l8Bp^oPR&x9m34wxH zpRYx0saMvBU(Myui%-$He22I9)hSDmsKN(owi$sl2zAjykYiI>e2bkGHQXj5hif#l z81$#*==AzNLb~#-|J3M?gv!q|P8F=oVa{|EdQ;~w)LU{Cyyj>cec|9)ew)04NZu>o zm8sU^GuM3WmG|qm*OyU$B9oHfdP>*_KchQ$_p9SwMWeQCB;P@*_fF4wk^{%$s_GtW zU^Z8#kX-0qY4atk)LZ5y2Sj_C%X)k9yz!CUu=gFq0l@-K-6=LrHAMPjtqni@iH=Dl){k^M5wB)TY#6&MfYLXf$=0+R)E#z#qN z%;@Xn#7DfH$WI+X=VntnRPotJ3hSqz)=F$&rg`dQ&^%6uhex>&&!yH$guN+;5ow5w z)av>EhE$T=>~utL1B{eOePevXT>=aLbbAolZ{=6)bG;lw#t&Z)OLieX`a6tluTdoV zT;>r$r!1N4$1M3?`A&VaA10xeC`(R(h8VSH(VT2RZ(7!wdI5;Mv{Z6E zM_;(1B2s82wLC8JRAlq-*;=zj9&%86>71bayp1Ha1WEPEw&Xf{iU$Tw8x1)z38OEn zz#i}n#hgRv$RcWg5V{%}V4hd4{Qt_I5^R@S7CItjsr&Ag-4(N1# zuA%L38G}A7-Po@i6!+Z|Ex3ke)zDVfJU?Igr@lqTb$wQ~w$kxe{u(t%y(Uh*rf>XR z>vPwZjOsGWos8-UyA#8_6N|a#o0F}yAAFn|o6!lP@vk8cF_OtFuI)iZITXU#)F)dW zg?**{>YLFN4`soD1Niqoc!BLi&@-VngOX`E7s~d*t5CHRqbtfaYVMh#hOW zpD};_%rOLSrla1d^*Y`f?pY(U$@>LI4wBXYF9mJjL=0D(^8)~tgk1UeeS<U@Zi6E^df1I~ z6RDrz)pX?1;CZD@181~Zwb`U_-&?x%?WkiGw~<5M9$go8G*^1;yhU-wyfpQM(i(sX z>gbw5d$e$`pL`>0rV7sxX{f9=4LARFxiVI*pW;WMu~2^>Av2o7QZe|Xs6oG*qP$JX zYH?=Qc`U%SQJHy&v0Q|gQk(;dD0#Vah=qD|R0eR+c` z33WoGa`^bLw(pQsI*Q27xPK}ux2BV%J~$Bh*Atha&Ph|6$=YV5XYdPH1;19`P1(6D zB!6+SIL38-Oh+BC_TNwb|dACiay>J8hn*I3d2olNE+W7^Vx9+LIQM@C}Z!)yUUU{%{7f|UW2v*3f zZnFO&-&adZqmcHdax}V%qWdbQdUj$bQM(%{kQMl{EuIe|QAM2(; zw?1-B>*lc&2(36j-V^0*kLQc1S6C8SdQjR1i)P1`QeM)ypdx$p56m9Iyr9K5v1c-g zYl-2$@Uhb|usoPxWo*IflB^ugmxh|~3ElYw6~Ae@@(BS4am^BRb2tUSBGDA%e{LJy zsGVAhla*l+5T!yMh`}jyvX}{2pV7dsUdhgRQMbPg9aKa#?+7`#-pzQn^Llc4@cqv# z(G-;6oBW)-5@bfFmH?91UAFhO^$Z{z3ywwY`Bu3_#a*b}b@kY_eN7N>lsB+k?@V;Ubx-oMC z2#dVco^7;cy6Znb4fbtlId8gJ=yFJ^$7@#lVl=e@DGnd^W_XA~PJH=?U~m@82Ip)R z+ZUaFkX+94GBY_1$k~k>(9zz(`@k^AQ#rM2ZCMB~Jof(M4zW85=-XtP7$*hz{6nxv zTQ`M!Okw7e9Oxex0csgJT9JM#T9Kabr--7Ve` z_-d%K%uSi+MNN}rRc@v~K)YGtP47#4l4_2=qE4Mx(Imb$CS6ZJI}@eXWNQI=$5DawtK}m^{-vg*X0N$p`mT{`<-)mHMI5j zdWFZ0R$J@4wuj!=$krCa)1uzXb5>1hV8M)#!`GaU1^gsMQ`rF#LjTzovVG@r5_r6Wy?;a`l^K+L)vkpKGGayoBL~hHou{s)}LU1#k_0!ipeRn z812pW_Ijw!Ofbytsk`W7j-?8ncXiq z_I;zi=KWTE%O@b49-dlgP*gSvJD48}TjP2;I3=0z4%zeZtm0TSU{(PW2~g4BNy$&_ zbg@pLGgGr@ct^X_oxl%yF#P1V>?0o!#i}x;z{J1rka<*Bt*Z|Aynj33B_LlKo_@IE z@sK1n8T`e$j%|nEUs8}(3O2GtuqpZ3|4kEoX>5Nyn@+g=EjqQ8>QX(FqXLq=D``kb za}?Vw38)DJ3Ddb8?7y09dClXj9m=9U@h41`ewtskl%B&uubb`2G0i#TjNg%j&UIzW z2(s(jEt*(Bl7y>9M#;9<#g_WlGMLRY?YXmK8s?-5zh)veufZUyyt1~>s->zF8*JdGot@I@5oMCPaMv?0lEY zq#x#~WpN!h7S-fUGD^DdXMJ?1(IH|&pmHg~e%v+!|L5>G^O3|V+eG9s_EL+zM^X>j zYHQCqwwZb_nPSR}w{lCD%e@$cv+??lqOqSW{e_w6NW*nowS58mA^Fu^ftJ^G>+*1m zoU;0(d%x1-(kZPFTJUw8F7jwpJX9peDw zzQ?iFs=e55Exc>-(Q7kPlp##mBF;qDErx#IJmSCP)heD?j4+_XC_h27&_^z`!QPP|DD<80R3jgQR>G+GA{|5uzIU>ugGO=DZfEAALvhOZ#osixZMe z7faQbh%2%KDrl4^jvxJiL~ZeX`z|_B$&0KdAR-UlTAm#Q&+^v2il8Zldz9K$TCCF zN1*o){f^ey4DGUi%$rXudD7-$el>^H9#RR8Z_80ai z76mV#E$_$chFxY6hKUgUqC`fqH;*~S6Lb>|6twjZ2gdg7!~zq~d%fR6gy>JMUb>m- z-!q~w3f9-b=gZ6#$PAnn4Y^|`{J2=Qwp;0_F0&UW$R^R?SXJbUjDRzya3fZAR9`{W zcQ{w{Z=f@S_TE%uapuWUD%=7Oh={_cd}@9X2}8#B22-pkU1rZsb-SPAbxVmpW}z{k znti=E4L>5YRP*{4v`kHYav$y$uKD8UKGs#XijJq``nZe1L0rYfJJwx1TH?WmKJSA1 zNro7<1^!+im=3x-yTmI4JI6in#oWi$2VC=w& zJU^ep?;yWRNe^ZZCuQYiwDGGsx*w2HINrvDqyS@}7R4Jv)lkau_2o*a_1dke2S*?c zsREK7cf4_TcdD`P-F~C&dDhvDBJ3EbUH_4v`-JeO{`Teb4=V(}p7v4`-UM`3RK2ma zq1{qLeq|d#8t6+=>wJ0pzQ@~z9#Rmsa%|Au%aHNjy-Wt+q=1JT}h9Z?|4y;+x{cM}mQVFJ`8LpxXk0kZ72nRayW0 zx<3@ruIGbpJjN1;LQjzqiUDN8S4pO$Z#ss(Mq{4yjkJr)u()t4{q~q!p;h|+kye1G%^LialYNz`NMf*tAA0Mi z9!{#cXXEq4jBmyr9^c75{%K!V=i+G^sr^3jvB8R)YMLMF=pTQ;Clc;Vi z$+$BtoKQ4g)k4l596pGX*z4z}5FB%#QS9ZG>ZkKW>0GW|Wq{O^6n zXe+3D70W)`nHl9?L)z^-OgzkQB9UbK%91PT{>#1}9J+gjQ-Tm*3_Fj8E@SVq-#{j)qs!9%e23XT}RwM)cc-#|H~loA})@$U6Q&8 z&4(%&_T*%y5-K!u;JPh|N8nkZIgn-_pSVoxr0hGQP**QrLV*zQ}u*AQQZgCsP zNL?mm?OLWiopdz4HfL1tzHc(-Z7uBglV?QW^QUzdxbfkU4L)giHU8p~I#()mL#Y~M z`^9Af0?Z9@tw=Q#CtB{J3$iI#%PGk<0_usbhn&!%xjGA3Ie5U(ueOlKia3X z3oIlE#{-GK$+QYKC)drMwNsfU+%#2N95+fVVBvq&A9(|HD;3RV5igBSgu4Ec*#?sP z$|F9nj1rb#((fZ4BxxmFSy=|Pyy{(F}(qzLC3 zZCOl&B?djvNxn-)Mk`zMZ@1hb(qx%puD>|o?Ni3$Ub*HlXSvIyojAQ?{wd+vMaB{E z)UlR|>Yemzpgv!9Ym4@~7%g{Y*&ZD<{?$!1upDrnXR8a+^7UiWLDgD!9o% z802WNNtV{|KU=%%u)X$^-Hn$&Rr>v?@-X!A*k$vJCsq!7`(%j3h`<9Eh{n)In7b1_ z5%B^41q+S7SPZZ3eLf;LdGwdRvG5Z0BgJJNsokfDM|s$q`bC95y=((1_e7Y_;1f22 zh|u}vwmK*ir_rZ^r*p-xLas(3OO!i2A;aN1JgbsNP;~7r+bhS1q)_8iX2N`)u7kah zJNc{pXW0sRkMrAu;*&KIUQbk;K>;0Gu+R%U2ZmU`4Y?n;!W3P_IE6E0I#vB`boEPP zH^qc*fYyr&whLd@r5e1?wtv-rWd#0keG@G6?MnZmy#jql!Tf>QrkkfA(=SPGOlgTd z;^+d?5<9iHaS1dSxb24DTo+Yz-mk@1dnRZk?9N0yxmhcQA zwXMNvf7IBM1ij>`5sT|Mu>PT8j!Ntljy&`VloqM{!!_kzs-EEtA~xGF7bRH zFr{w4JVWqzRZr(xGsmVTes^6qmPaD^t5cNgeO8Q@SMbn?{FblGCz&}41v!Gy7wj)| znMoVu&BD?_x)-k!KK3Px7}!ofim4QC@sUb)QuvZOqPo=Q4^BG{F&5L9DyZFIv&%1( zZ~Gzc6)eNbNX8ZZ409hH-B8Q5SNtikC#g$K($hv{QeEnB(!Vhda&+TZdb-KwKNiL~ zXhQ--{CqJb4Go2LkVwrveg`3Zk1M?fj92nEaT{+Ts8c2nyR7>xo4`5BR9&IMPhl_j z!J&Ox-igBgc4)9yLq&y|SMdpre1lqmj5k9LZT@e1yxU{d?AG1|R{P^qT2H!2w#{#=tkN?)z4p5$R z2C9XN((0U?C-ZE&h$;&SzA)y~Z@6_;(ER9YZ!Z;DLX; zB}WNcP6}uCQkro5P{cJqI<|-rmDHlqDi2z_rqPM5g=)S_9u$Q9uI#h=2+<$TDlL6| zN^0?nvME4HYjhzyPxEi+ zaJyFIVRA?g;+KKn#Y>l8hljN;H31|5Z=Vk6j1luO9j@YVP#}^|H852m6R0+@7|I*z z_A}y<^-??A6OG`{e8>Eeh&J6ztJ1N5)^$}1`u-%>VgDANlC2Lk4D)@T^HhU@1Iyqq!5&$^D=4ec@sT4dbz}B%zWF7 zJ@dEZ6)6L!({P9rsZog;`svUH6Z)yTCpnMY0R5oY6I_U9N42}Z?LeBh1>FC~jai}V zCK>wiQY?IpgL8gbdvAfa$W6uo@}eOaTy2%)$lxL@m*xFsi$&}5+u;~WN7uIsH{G6W zP&2OG8v1Puhxdo|GtiY}O$WGvoJ&z<6$GHOWmPeF}{3qps@J=aptxCGs^b;a?_14BBc1@Yy z!DbI-t+Mac$lsZzmWPbVro*(Qxc5#5kB=UsmWWqPzjc?s%Vx=`2m)=k*T)2iM}sR* zn6V$%^NVmXY&vr-`^9@}$fRp{&$f}E9(6qB+{OL~Q_ehVmBQ7$cBv7?HhXl5)@%W6 zx_tYGwX-?Kn8)>XcLfc^ATsaGiRE|kI}^*1KrC(u_2t%^7F`SR4!tLH%UA*Lmdvr7 z!!C_ac6nPou?W`u_~XIy8#&l!khtoM%CKWEX=@iOTv7fDo^M6ObQ#|t>j=Gz#|J%G zEyB8h56o$yoO`)da6M&lzDU30RNt4yZ(>?tXV^EpdEG~iBlW;)&49ff_^bK>OYGvQ zb@U%B#+;xAth5I_d(Lk!u>hKQgnR2)8I3|00pFHk{9crGov&%1$6`feA#gyON&K?d zChf7+aIB@PM+MUD%3nkFSOXXK5F)P*UpO1988gsCJpZeSQ*1P`B0z{D$!48H{VglK#!f_-Hrm z{sB?%p+$TDnTT0P%J^#t3b#j+8>W>fblaA6`T0W`(dvif4AF@!+-%ks+@>`piEeZ5 z?UPBx^~ROoF^y}@#Mf@bQnTIeTvE(o01ByT)Di&<7xjI0FAN|mMX)MP2y;T+@|<8v zJ>bQYTv~8Qk*qe;WWPn#btiq_Ap&KG?5Lq2_%QF)D<{xBb#_j-5FTj94m7lCNUTLE z#fWka0nq%%&m)-V+Lb#9ObnClK6L_d$mJ(@)zW4gfo8fUakQRg_pi;9z$ida0$6*; zDFdhiX9Yr+eTDLWlq~@g>6j#g@q!+Ao@)HZL3^h=6$%lHO75tAl1+sw3+X3-*@3(| zPaQyJ-*?DBnjNR{D3fnHE})v<J}@Tx${&@bj{b+J65cv-q$oB zK+Sq`A*ED*>?UN`F@2`YmWSuwl^-xh5o~rP&W<_4q2!QrYmjo8%=8IGM^bMuBXLVP zb%F(P!M3FWbbQg`pP;a{J(WI{&aV0VmM3-)q+7=nZ^nP8|0DF4Vn*pHJ&J~#TlqF6 z;RU0%a}>cHH_x}FWIZ2i?vD21ZFsXqXI@P@bs8?~;Gb8BC4oB{^n`V!%iEJrW>y(# zG*1_8eu%{oH1mWx&eoxDQi=H_PGOHWctJn@Omt6{o%fHGWQ@L{mywIjPyLimoNXsw zVQC%OtM&tL_M}|K(l=zD0qeG^k%7LHa@)In$o7;xuPTr7<)fi+*nT#$-q@m^+fkgK$NCvAJAT+Q)4T!w5z6Mh>LoZkFV5_>Hn+f zsNn0B``J6^#l80(&{>vssvvW6KR2Yts=4W;11zM$yE|v zoEGlf=al-^_+9S{r&jlADqS1;6MP?xNpAZWWgU3d+dh3dxA>Qa2^P8UEcljt=}VjZ zED!i<1uD;ZG7Y2l6$6;a1H%Gen$lR~O&feceB#<9{WF}|zMk})l~s$$4$3+CpO-$P zl{oXZMT?S$c5*5fsrzYz`rlu zH$T$-+O{HMWTxt?m`G0Wpi>!GK) zWGd;VO9!sJ+Y8QBPSxN8@-rhPk=G*IOk24E`+AwuadoaWol|#+AgPVG&L+Qk-Zc7I!?h~NM*pJ z2{MRTtIA#u@SisRE$3Z$x< zXvY1Mx|NHGrN|$RdOC6QQdpuQLw{gh5|VBIv=a0wX(=D0C;Mqx1>>xDfc4YF>%x4W z&1ibsEU<#ST(&R7Xt6$#eUNo7_4t1VYGVv>UF^TcSayYlQQhy>t|B|8==Da zz=mLA^64RCzrJ#G@ClN|*>KonxSQa$onj3GHj)Wdm}KwEA{HJfs@e5h>e}-v&IfHi z_(9`=cj6pnP+PZFhx)5PQNp@mI(LhzumZ9dc|lWmN{#B?0PMp?HFF8Zx6w||I#h-@ zx>pxc6Z42BKQrnVRFJ)EW8vZJ7bNZm8|c|6(wM6(9ppbt)Z*s{@I|QHsys@{sQx0M zt2?Y$>k-Se_=9PgVXpVN>QT@!4KJ5{JTc`S(|ZygvtCZM8hOFuZ9vkFN#QCHc05bm=<8Bv(Rl8A5N+C&7K-A z;ftqUN4Rv0_qOoYohC*E>e3vp5RaXNWV)B>K5XN~o2L9(Kd2t_Mil+jaYl_yihE>b)Ts0X6T`?W_0bz4MN#sZjm)4bRoEtEYV zlxZjHMv;=tJb$?Nuh}vwvrhj+OoVquD@n;3!zIFS8WQ}Mi0N^Yy}99=p&fL+VAw?D zulgDTyjd>fRiv@NP{^~4l^-W#bg%gszLz{?w|cM2&2vJtD7o_FuPmL;&mv2x!^hZ9 z?HnXW&(v3qnm*zs?06Cw*Dz?}<{~l1uSuJRJEoLVnPAN&Hq-Uv14@1w?+^nYRVQ3w zP(uayR))=~1mFBW({|1QUlT~o6onbM1X-=pWXZ-fo2isxcgaiA<)@E*Sqt1_>j!*Uo4|uF3T76?m}@>(xdkQqeX?Sb%O4DeE z&CEOmnj&hN#KP@tEXi6Fm?tS{KMATuu*Ol%QqNd2Lo38k$q$mYxn-L9qnKL6RF-!2 zYlvU|>ntd3l}e^6Tve`bDv=@@{aVBXdvmK)fifgZJfhe#*Xj5v*l(mc+aXXA@qzOm zd3Vn?<#f~C{&9AnTOYhsQXe%jm2`C>PD8B~QMIusdSf<*m4r2?~KP zcLTP*o6~i&K25|6`HRIY3614ZMF1vtYxG=QXb>3IvRsGdfC1i??7-`@*pKlB$1{|V zHRb#<_=KCH%3oCF83_(+9tp3^CB9 zR1)eZ+NkHk{K&glzId$%J7^xNiPtDKx2L-r6D}p1K01k7@#{I>!pF;-A*CNBLdrzL zdn0=4sAdD|K)fF=My5h%0#pkmAKia{dH{+iVJu)JR4jR9myx%txA0$uXAJ0D-uc|; zP1%;C7qZy5bF4baHgeP?#@pddo9V_k=!$p%Dt(r>7VSZ-5 zrOM2xqpF@DH?x_aIn%htbh$k4ZI{n%gIX@_k-Ueyn?=G4T0Hl;jh~7xbkC8yEcum$ z$aF`;2B>t)4rQ4!C+M@Unz0C@ZAD(gTcOmiM3$$CK8nuxqyxt^yEoll*?I!#FKlFs z)zyC$Lr}j*Hp6eFeSUJeC}r&s``LN(GYFRld1UTkr4~( zxM{UWxIO5<@ydQXYMG%F6@AMh5h!P?W-Jy7u<$8uxzMVrSbG^;b*f$ER`#dvn6R)l z{iz$5aV`&e0TD__k1CyWJ>(y5Ub|hN?r)*tGP%%n?ss2g-kp~Z?XYU)WOcM!w!QwocsyB+?c^SWJaX+|qufW*q_q zZV){wYgqXrmYe@5*(6g}8iyMz&MR_e_5MR`QsAE)RydrxIMsl>s>dq)#0KfT%ExN_ z-rdjYjSvk-Hq@n^Z2kE&I_mo_$;g|PqDp*S+U_P}zsgTpD`4~!rp#ux!EV;*hu7HB z-uqcpTU)Mx{>p28Nesw0e4JVS=*QTeyj3#kL|_9;%;ybAjr40?VW~KX-P7VhKN${) za^nEGj4s^{6#;g@dlQmdWf7B^;NE3wf7GUj%71& zwsHhfkBjlD+xKa&2q>O4R@7E@vrP|B&zg2tBeR}de(G6R45sUJ+&+V>@s|aOIeq@o zcDl!$-9~axQrjkDP&AZH(6|)dVBxhdE1$H>xDNRF4;{KwoY%bnFw((D5P0U|n; znm?Puole6^?#N0-j$HGaE04h3GtS_8j7y4=22mgqZ{!K_8VSAPrU^5i*Kl8e7&5oA zB+3Mdv{0AvG`@@%`onH5Eh@eA$5sb0+BPfh(zwd(vi2KN;hve0lTW+j!Cg_d6;l&u zLT_sun0#A*$O<*AAtye_`0@P9A`kt)rv4=Uj(V1xxyG4D&)qC_6H|3-*N2BOvyM&! zkxPTm{QI5%rt*Ul*IjZ9+h=4OSvu##ok~yYg}%#5@y~C1DecUBG^rqOkRfRvV~PDX zYy=V-toEVNYfqR};_({Gd!Y>E~)l*Uh_=x^o0^F0B8oA?Ba#)Ai|jH$$6$@yX>ue|BE&?sf7WSi?7}D-v@Z3 z*d@_6MeLZwlL0mBk3K&H1`GW!hWfoJDV-+e(2hm!hft{gRrIxTiKx@ zpLK+AV!9^hZ^JI`Xu}XY=Us&3FOd^+=&%j<(d7));~mh~3x&s+o=JL^abt|ZO;nM- z^!=w`U7@Zbcj;GT#>%7#>#ZCoW-dt`(m&|Vdix->2OE`yl|7?48>wYL)fa)~(52YSB;297 zNVwyda@gSx;;ZdV{QV(AbT{&5nHRG>Ie%wHgzDJ1jk(zhJGRc3Kamr{tcsF{L9B0n z6(!t`Qk+Gr!vZcG25!{W*b}->-Xbh}_1S(YB00c;7wPKk*J4Dd;U_{{f$0&LEm8N2 z9N2*J{rSyT#fxT&v!Vfi0q^Dr%T&dhmQF z0-GFxIf3nQSYu57Z&p555ryzcw7#cgL1tl9iBQ|vzsibe$UX-+^tZZoXff;EC1i^u zFSH7TKEzf=gj{2nmG5sEzA9qe~mA(G$fP`b-D3f1rf%gy@N;) z!wbcD3KZtSn zWHnZJ4uYhGdL>8Zx)J2P~h$ifnJx5+*= z?pF069H#?80`%i782PL*RvTIQVCe1%2H3yBh>s+dk3Okg@S$77I!p&fe#rLWu}w=E z;|^KUbfUSE-3{r@livN(JD=^Nx0aku}_ z-f8~wx2w6oZL7RQ81d}Gu9>VdD zTUV6w)`GXlKV6B2z-(^rW7mR<)&{srF#V4A0>52r@Ir}Jy|veryDci$Y^K54+OR%D z0IC}pdOZMu5S~OQmXh`N$^r6-{^GxH^nNO6MX>*9GiTI8eQCzL3DG5S|7JzSSL8O> zQ8LvI^Q%ttKYwLel_3=AJ?;3v(iJr$_v6x)2KOX)v(H(Ewnyeu=hN>hjp~`$wwC@N zu13=W^7OkxH9I+7v0*f$9qi8@=d^Ui_{yW~xJsqe1nf9YJ%o6Q z?|#b7DBf_*)cpB--YL2J>R*OLIzl0C>tw)bQvUwXw0I*_w`qg9a8yaq#wN24OyhKE z0Jan!>)vQ~LC`sEBOWg5kB-ZH|c%NG5eNuJ7NVMDh1OSN%i9Hu83S=Dq-8cz}@FRt@uc3mVU`L6B z!Y{bz`Ml+bRe3=qwO;q zz>@3|-FO$XuY#Z4E%*=tC;&5gq`-T;U80yf>+NDmmp&B5u7C2EKJPl%3v`Z;Kb#7V zRYKe(2wNX(q7ae~DyWlWm0{5ia9+z3T!_D_ z1APNi z$07JOyzp00WoQWp@yTPRgt-17ez~i+0+K&`oYR4S z&}O~SMF>FjctF$Zaij`3y@0?Al@Ibni+cvZ~`t-p3p&wfGeNH@K#x7V#`t}tcg5?wr~mRhBY9KWm=cF z&D%zHD642%b0t6Y(^)^k*$ul#wuP!!k2m>H1pGM{5xS<}6dXVvk2RW~xDm!fSw?Tr zu7*n2)X>7FJq4@%o2<0=SrnoBCt=i3$^v=7OElu@^cl^ z+*raGu#GWEBDR}W2{T$6j)y+n+W<%vg*?kgmGcV2v<8M*opuU zQV)_5ae5DV3w=prLAdo}b`XXV_wo))gW3pMkKO=ah3Afg*5fAkV}%VM4Bm;ZXF`hs zfce!{yuVOy0yt5k{>hT~UVgrbMB$jZ#;U-Y9JbzF}vz9h{v2)RcZiRAA z6zdC4->_1XEOLG{qvQK=&S8oMFV0V6A7>_vKbpj3LBvO41zGR!m;aCOx|gE-k&c;= zW%2j-)j68y?lwH5usiWSj9khMc3o#3+i5C+NE@L(KNQHcPHA-R-phS?{st?MS^IUY z5QY3Jkg5O4X)?sijc$~ez%3J8u_OVBT#~S6@uPulFRPrt91@fO&n&B8*jl5uB0^gd zG3=dDNbH)q#=UiG6cR?`lf`T>Ho_AK7Rf^14J~jTr!Q%pbzd4MUw5@6cd~b;B5!xi zHM^+_rob5D@fYq+nIbhv`Ra5Bmze3*cSt}@3A0T0Ezvtz)sIA$vwL?N3 zg-(5`AGM1$^#I2}t?cD0|;%n znJC#m1rpehz&ikv01R>3xo!Kc9o6bGKp(G@Xq6Zq45VApYkxxvF9Co6l|TwW6)@ny zuYLZW1?~Vi*J3oMm;iYYz%K#&9`Q`8TF_{~3em|U_$}}&u!?A>JEHy#U>{IJ$N*|3 z+=WHVwMGLJp%);FxQq1gPG$5dg&Zy)$QH9752&Jnijf!TNqU1@;dk-4i&7z_%{r=2Ep#N(uxLHNf?Kd?-Kp}dI7rNyaU{6U_*9HaG8jAic$n;pX~7+ zK>;kfjf*B7 z=Z6Rf!jJFRfmzHrDlbk?6$iCAJ!=(QMf!iH7MX(KZ?WR!O>naR=Oo|&hRf$6w7W3o zEp{B|6%O|QuZN2Qp@cr>$%YFRsdje0~0`vBhcf_;tDD7o_5Om<%hJRlKcT&#~?Ad z;r&ny;ahM~1z-tra!-n3Ob2SXINswxKk?qh>{cG{I992UT|3Ubz0DQqtH z7b*(&#sjdw2=!##jZ;rg>XvT!a!@qsAOYSIEJM{h%Z$dA3=grnnCYGWLvKpJqSB@@ za~;`R&EcC8c{!$f=NZ8SqfX(pxCYVNg!8`-7Kz%L{<~=W|!?nt{C%PNJ0gjrK-8^s-3wbHzT&8 zpW9cQnzp!3$(01u(GP=eL`UeE0;TrC0oSV-;yU(IfMUd9^XDszTVNRBAq&(Rw>v29 zfC2)0KFzj7oOWD zMvnWdeMRV@b1i^+Megm{(}n7N_L7cnKSixu6fb*;Z){`2RQqpkXh4s1pIv^fjbg&2 zdo+cDn&07xoeyFiH89vcO0*HcoQ6>GC;nuH3w=^$KCn)sv;nVAs6> zcVW!4*jC-d)7F^U|G}C+e*OW+Uc#%~08K>+9N>3yu?OL@$XR3hk)QlJccAB#_SrfM z+@#Jzcqkqtnas@X$|Y3+=>FsdSbc@`hSu7lT)FfK|HXW@bA2(u2Sva=SJci3m>GAU zxs`R?Yb_257gppP6&A$~LJ z!96d-ToAJ0X7|RtBWGs74cC|xz<&)5f+rN+{R5uS9}ZHq{}LoQdEb-;48yy9xY{V4 z=R2WL-Iw$FxLvQpzdU76;jiX(OYTvzoJIZFQY~neRD%~Tyeg{=ovR84hCQ4HVyG93 z0I)At&WT51)udBaejFOzauLdB=L{6dp%6ZetI%DwhGP)(P&c?K>EOnQc_@s1LE|b| zRAO=7(+cro|6o8WNdep*dvNm~Rdr)}j061)W~z8Gxxot^$H<5!V{}+?v_nb zhHX)ptas)bFuA6viw?7x|q2G{waCJ>97F;RcMA0-6 zH6uxq*_ZVvEXP9i6PI>~ZZt>K;q|;4Zm%zrmo%=Dmlz0d)c;xo!0`b9a2zU(>_GZs zLPC-}Nyr!E(CUCj?rYpu0$fqR8d5O7@Z@&g zc3I^#-3~xE56*t+nNi9&q#!jALS~dpusGykfh8B1;`lMj(~-WKXbX~!)Hol|{7M#* zeYHRK;4NAFm0)qOR5i^JLig5B-9II}tOjh&EZjyp;&Rs$?dWg?E+>lP z0^duTU}x*Y3$|n_`s)eB#S(?41mn8&tI^NbQ{4;6T}?-CVd+;xA;FqsTsX>GtW~lU z(N%J`OnW-=Piz;L$rx@4(a^+n6Ri38eLd__qFO&UAoHpvalr#p`7>{h{}%l|=jJh#fdq#TQ)6h9wX%5cgJb~+lV zyw$IFu`D~NG=?4NG^2ePpYP2JR=J0kreD2)ik zsz`s|@jI-(J%oevGCO{{FCFs}`Bbm&57)CXOP^X~cP z_%v9}Yl{D@$ZNwt3tJ3M>>Fu$b2r8_*u0doQgOdMRJ{igS}45*RQ}wx94bjnsE7Rg zfiP{dyc;7Ngl(U5NKInbb6`!^e&y`##Aljw^j@R`0~D9q!T#meW-&v%eCU!yeedjp z8HMvlI>ygGO4+ksJ}}h}Rd%z398R^uo4%tPQHdSSc`E(VY@Gg$p`w@GM4ZghitpO7 zQX~t5SBJ(O%^@v|)%D9RwQPuLKbPf3mohJ}Vuj3l^}~s{t8!MeRva>^;9{bG@Tw!o zD`9b#@4Jq5i6Uo0JzFBk!UW2Kl>S%g=P!!f4_UFgOyRw*$jhEA5A(DtLicgU@6k(1 zR9MRsqqMKgafFokJxV8=1~yxT>-QgR*^qK9ki?=3b54CvcAGr(fQ)XCRIqXidT3L3 zk9Qz*MxV{i5G(^Tz1w&`y2n0{ISW2=HO2;X;t1lSd-P>L%dNBj6^40Q#-aOu3E~Jx zCa?fh*kzpdRi*V(hxOfBukocfzxnLAtIHd(f5n??6M9wyi2p3`(jU79MR#-&%^+Ci z^6%Zuvd|sc|7H+^u0~*~mC~>yk1TYXk?S7ftVj(j*=Tw9kNa>B@$+XTL~gO>-qkVs zXq(QzJn!Fh!EL({>)vsVbou?!r-;4nE7sTGYozj}w-KdncSN?Y#@*6?s(a%?(U@m; z&p3shIymT+xBM#d%qMDOkiG?sUBxZx`%=Rb!8E=(-ZGSskw8elg?cn7MFVfD!9V&V*y^kvFKYFBWT-TMD zTE&jkm$~PV5@km^)_B8jeyrbwhx~UK9+HgWXgLW~mq_z_aK={}opd2_NoG14q%x$)p6aF-kbiuWIU)gSE+C3HNcrAt!Ml3xi?1nXgg?p7#&P5 zItZ$wv}c~~S@__Dg%#FoR&sQFXFHSmNz)L$|12>&gQEZ6Im@>CbBbF0hV(lCN^Agx zo@GRvgn_l7_Oi#1C-dEOgnJRE zOXITM`uFL}$151qe8pK4JWKDPH{NgFjqidi*~%#!2Xo8|!Mcd3`wQi=h$lxa6@=MB zt#cj@`9I}-&*c1J*y9{G=M>2F9U;ZtA=bCOFkTmy^;5!E?H@`QuQ}s~+#>t})@Gu= zJn2{h(>4EgFX{T~O2$m8oj*aoj>O8?>TxvdhcSFi+QA#M)=~a zjzXVLfJa9vk?rzvZxrWu)nyA$y{kfwl+PVJ_>8MmOU|oWKE4k+eB#4ty)D7DqzcZT zBWxPOS$t9=n+YA`*W$UB=>Kyf=}%rJcR$uQN5WowAWENi6A1g7vBg`o^$$O@S!l5 zHBz5(@Y}22EVvA?sV+R|L!*%dUGsQCjOb~2DwCCQt zVH-v7`kef5T=DiJlgSHn(Zd(s%jG=Ch8@CBKcojOlAdgJ+AqFOPX<>?MSnH|j zc(hGNMRS4fzbU^UUh?^Uy+U`nma_-x`;(*Px36D>*^T+BEnjnsG5vRze@$MT#`BhE zba{l?r!t9ebJt`7_qm?&NOalsYK~8|+O%JLdPL z6y+aJZA((aYuH*UHi~X?j+2Sk;?|DaBfk**9F_k~GvYCOK9##B?!P>P1x!7Nsrk?M zTs8fS2F{4-M}#Z;m63Le`wIB6Zov`%I=*4zJ=w*W@|6|Q=I;5EA*1@LGWi@^ zraOPm%Vo1IDo#6L@%65sGYTs;Iq@0J`~mL?#wcy`&(VSBnsj z{NnypL+KlzmZO2{11Z6y>2QuW?;?ALf*&=Eyi)nZoeg-alEraWQ)(}ONAF=i@1ivp zmE=ESYbBJZ%^q+57OA$(PJR(8@$kQ7v1t}!M?cLB*L?lJBAI6gMk^ol^-bSXJiPs; z&#A5{>37uyo>Q>G_7 zZLk~O`}2hnrCsSPDi8;0rWDb4v*U%|mtp)m7X&s=_S7mAEv!DUwtUM0SB zASk`GRZN>4S(mY%{sC;mrsUF|)$?}*1ZBj$oi2$%?%C5ysV|zMHgr(t@b&cBJo_u# z-iPp~O3SaRlZ)jEzLWm-d2RHE>?#=ka&X0SX2gaan7eBrr0y^4z_kOLxYI@G6(79Y zWLETY!Kp`!&$I0Mjw>-YQ-11rxbxsxSayA#pJ1!G|kf=dL6QhSc z2T6%mGqexnB6rEl*7R%X@hU%-$tJo(i$fz}uRM5qNqE)V=P`cC2t;xs0d?-gQ~TtE zPnb+OaN=^S5D%Mw%siN`-GE@z;&X*i*X^mqW3O?g2l|SraW7vM6O2B}2x{k$wFWym zkz_gTO-Ag5i2v}*?4a)4%axh{-`T;N;x1;O^V_^o)$>c@aQDfwt!{$a#6fyRA|Y`p z(Hk)cp7gNgz-n2(`Y0>8RbDEgq3_uRuL|F$vVK&)P6Y^>0;$-h{BMvi6ul4i^hZUE z-we(n}mr+Lc~T@YI8Fb(K5l0hBJ^ zK95BDzp4*HzO|BT@^IW9%aU#HU4gJFdVXXR&jZt&KBO*fx15mp1jM16PHUk@tg^eD zNQjX^pMke(Yk;wiL4;IKgL2I{>|Z0T;dxhN2QZoyS)M{tmy~YD@YL=HLEVrt;+Pfs zj~uuBU()}>O&IuHKKl@uwB(y3#lLT5mKnzxw=y9aShsw3?Yy_&pL+jM0^eDE!9I() zlnd+N6Q8!gtnH)TkkTxBMunU5T3n@WCC^n>(VV0O zggZ%CThfW9$R6=`v7R^*HS#RYpAf*O?lhK5jY~qv-}6^{OhCwq08WfgBi6{_hk_42 zOf4a?JVvsEW!mgru17CU(HK|a&nkM1-&4hOX~o>uBE4BkM?X=(n>&+hsAHJ^$!wx_8IqB&| zm|{6qT??odp**UnaU%ugrf85W-Z%n`i1C$d9N`@}n*=;7Km}(^DO;nOw|+8OqoP#| zo>{x)*J9L2d9#C?Q!bZCbPuP9hNhW;?s`f-(IaF;0Dk`+tExQ4MIb#$@^DHlPKLi9 z$n00dJ?`>{x_A3#x>j^%)wJ4_7@-{W%3zG>wAkSTo?8EZioLJk z+@i~A4t~2|Ap|TdC5h9S66c}t*6_j-%28JZO(_xll8nY}xZ~fV+YYNC`Vmd5qm9OK z${y*iGkG|st36)(uc|)Q1s(?oV!9Nc{Pk_P^#RO;(?qvK&JB?5Y_QW6YYvPi`=;0q z5@}YxjtJc>f*Ku7aayA~Ms;6wpIt}WJntwh@-|(0Lzp}! zluN%n><5^$+Pg~*%7Sd(;1x=hBm@D{gLcq6FTGWhYq$A1pL!402KrA0VeGmVwGFq3 zSF1Of0yfhh-4oOuiGCR#xLp3WuqDw^WT9H)jEvg?=kKxUs!VR1`b9_F#ny7R=u%5b z1v&+O3b#6MR5dXBX3GI%6~%oQa`nt5{++GXtL4#;KFkKz=@X8 z%~$uz{3-@!KJ=@DPecOdGGa^qEUp@Zs@Mp!hQ2FF@-Q_6h@=x-Z9nU**dNN3_al8rsE8fCAknb2;IKSBtM+OuE{Vx>P+B(wJ6A#pA$1`?1#i$`f`6CruwRmsj_ za3$OvEfoW{3uEFxNGy=HLGuZ^Fn0VmJJ2rc`Nssh{9+6xT#P8AA=~4Dh@BC&8%Orn zSRZ8B1O6=;)pb&6sJVpC=q+nw04yUSB$0_4%FR>atjJu~qP6C%at@(jkivPSwQ+bO z*5UkqXbJi9!wS@b?!Us4V}_mJ#z!YQ@%?!(mvilrue=$}PfE%^+N(Vy`_jHVK3GbH zG=5(!i{Ezr5O?{~u=~GRHP;eXG+%_0;ownMWtIEO)6QcqA^x1Ma2( literal 30454 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 literal 0 HcmV?d00001 diff --git a/scripting/L4D2FFKickProtection.sp b/scripting/L4D2FFKickProtection.sp index 03507d8..3b8d78c 100644 --- a/scripting/L4D2FFKickProtection.sp +++ b/scripting/L4D2FFKickProtection.sp @@ -82,10 +82,10 @@ public Action VoteStart(int client, const char[] command, int argc) { disableFFClient = target; ffDamageCount = 0; } + PrintToServer("KICK VOTE STARTED | Target=%N | Caller=%N", issue, target, client); return Plugin_Continue; } //Kick vote started - PrintToServer("KICK VOTE STARTED | Issue=%s Option=%s Caller=%N", issue, option, client); } } return Plugin_Continue; //if it wasn't handled up there I would start panicking diff --git a/scripting/L4D2Tools.sp b/scripting/L4D2Tools.sp index 2bf6fb4..8b33d56 100644 --- a/scripting/L4D2Tools.sp +++ b/scripting/L4D2Tools.sp @@ -99,7 +99,6 @@ public void OnPluginStart() { } public Action Timer_CheckPlayerPings(Handle timer) { - //hPingDropThres if(hPingDropThres.IntValue != 0) { for (int i = 1; i <= MaxClients; i++ ) { if(IsClientConnected(i) && IsClientInGame(i) && !IsFakeClient(i) && IsPlayerAlive(i) && GetClientTeam(i) > 1) { diff --git a/scripting/include/feedthetrolls.inc b/scripting/include/feedthetrolls.inc index fe0d2c1..f49ccaa 100644 --- a/scripting/include/feedthetrolls.inc +++ b/scripting/include/feedthetrolls.inc @@ -1,6 +1,6 @@ #define AUTOPUNISH_FLOW_MIN_DISTANCE 5000.0 #define AUTOPUNISH_MODE_COUNT 3 -#define TROLL_MODE_COUNT 22 +#define TROLL_MODE_COUNT 23 // enum trollMode { Troll_Reset = 0, //0 @@ -23,8 +23,9 @@ enum trollMode { Troll_TankMagnet, //17 Troll_NoShove, //18 Troll_DamageBoost, //19 - Troll_TempHealthQuickDrain, - Troll_VomitPlayer + Troll_TempHealthQuickDrain, //20 + Troll_VomitPlayer, //21 + Troll_VocalizeGag } enum TrollModifier { TrollMod_None = 0, @@ -53,7 +54,8 @@ char TROLL_MODES_NAMES[TROLL_MODE_COUNT][32] = { "No Shove", "Damage Boost", "Temp Quick Drain", - "Vomit Player" + "Vomit Player", + "Vocalize Gag" }; char TROLL_MODES_DESCRIPTIONS[TROLL_MODE_COUNT][128] = { "Resets the user, removes all troll effects", //0 @@ -77,7 +79,8 @@ char TROLL_MODES_DESCRIPTIONS[TROLL_MODE_COUNT][128] = { "Prevents a player from shoving", "Makes a player take more damage than normal", "Makes a player's temporarily health drain very quickly", - "Shortcut to sm_vomitplayer. vomits the player." + "Shortcut to sm_vomitplayer. vomits the player.", + "Prevents player from sending any vocalizations (even automatic)" }; enum L4D2Infected { @@ -114,7 +117,7 @@ void ApplyModeToClient(int client, int victim, trollMode mode, TrollModifier mod case Troll_SlowDrain: {} case Troll_TempHealthQuickDrain: {} case Troll_VomitPlayer: { - ServerCommand("sm_vomitplayer #%d", GetClientUserId(victim)); + ClientCommand(client, "sm_vomitplayer #%d", GetClientUserId(victim)); } case Troll_Reset: { @@ -216,15 +219,19 @@ void ApplyModeToClient(int client, int victim, trollMode mode, TrollModifier mod PrintToServer("Troll Mode #%d not implemented (%s)", mode, TROLL_MODES_NAMES[mode]); } } - ShowActivity(client, "activated troll mode \"%s\" on %N. ", TROLL_MODES_NAMES[mode], victim); + if(HasTrollMode(client, mode)) { + ShowActivity(client, "deactivated troll \"%s\" on %N. ", TROLL_MODES_NAMES[mode], victim); + }else{ + ShowActivity(client, "activated troll \"%s\" on %N. ", TROLL_MODES_NAMES[mode], victim); + } //If instant fire mod not provided (aka instead of no modifiers which equals both) OR repeat turned on, set bit: if(modifier == TrollMod_Repeat || modifier == TrollMod_None) { - g_iTrollUsers[victim] |= 1 << (view_as(mode) - 1); + g_iTrollUsers[victim] ^= 1 << view_as(mode) -1; } } bool HasTrollMode(int client, trollMode mode) { - return ((g_iTrollUsers[client] >> view_as(mode) - 1) & 1) == 1 && IsClientInGame(client) && IsPlayerAlive(client); + return ((g_iTrollUsers[client] >> view_as(mode) - 1) & 1) == 1; } void ToggleTrollMode(int client, trollMode mode) { diff --git a/scripting/include/l4d2_skill_detect.inc b/scripting/include/l4d2_skill_detect.inc new file mode 100644 index 0000000..99cc6c5 --- /dev/null +++ b/scripting/include/l4d2_skill_detect.inc @@ -0,0 +1,294 @@ +#if defined _skilldetect_included_ + #endinput +#endif +#define _skilldetect_included_ + + +/** + * CarAlarmTriggerReason: the 'reason' parameter in OnCarAlarmTriggered() forward + */ +enum CarAlarmTriggerReason { + CarAlarmTrigger_Unknown, + CarAlarmTrigger_Hit, + CarAlarmTrigger_Touched, + CarAlarmTrigger_Explosion, + CarAlarmTrigger_Boomer +}; + + +/** + * Called whenever a true skeet with shotgun is done. + * + * @param int survivor the survivor client that performed the feat + * @param int hunter the infected client that underwent it + */ +forward void OnSkeet( int survivor, int hunter ); + +/** + * Called whenever a true melee-skeet is done. + * + * @param int survivor the survivor client that performed the feat + * @param int hunter the infected client that underwent it + */ +forward void OnSkeetMelee( int survivor, int hunter ); + +/** + * Called whenever a direct grenade launcher hit on a hunter connects. + * + * @param int survivor the survivor client that performed the feat + * @param int hunter the infected client that underwent it + */ +forward void OnSkeetGL( int survivor, int hunter ); + +/** + * Called whenever a true skeeting sniper headshot landed. + * + * @param int survivor the survivor client that performed the feat + * @param int hunter the infected client that underwent it + */ +forward void OnSkeetSniper( int survivor, int hunter ); + +/** + * Called whenever a pouncing hunter got killed with shotgun + * when it wasn't a true skeet (chipped hunter). + * + * @param int survivor the survivor client that performed the feat + * @param int hunter the infected client that underwent it + * @param int damage damage done in the killing hit + * @param bool isOverKill true if it would've been a skeet if the hunter hadn't been chipped + */ +forward void OnSkeetHurt( int survivor, int hunter, int damage, bool isOverkill ); + +/** + * Called whenever a pouncing hunter got killed with melee + * when it wasn't a true skeet (chipped hunter). + * + * @param int survivor the survivor client that performed the feat + * @param int hunter the infected client that underwent it + * @param int damage damage done in the killing hit + * @param bool isOverKill true if it would've been a skeet if the hunter hadn't been chipped + */ +forward void OnSkeetMeleeHurt( int survivor, int hunter, int damage, bool isOverkill ); + +/** + * Called whenever a pouncing hunter got killed with a sniper headshot + * when it wasn't a true skeet (chipped hunter). + * + * @param int survivor the survivor client that performed the feat + * @param int hunter the infected client that underwent it + * @param int damage damage done in the killing hit + * @param bool isOverKill true if it would've been a skeet if the hunter hadn't been chipped + */ +forward void OnSkeetSniperHurt( int survivor, int hunter, int damage, bool isOverkill ); + +/** + * Called whenever a hunter is deadstopped (pouncing => m2'd). + * + * @param int survivor the survivor client that performed the feat + * @param int hunter the infected client that underwent it + */ +forward void OnHunterDeadstop( int survivor, int hunter ); + +/** + * Called whenever a boomer is killed that didn't land on anyone, + * and didn't explode on anyone either. + * + * @param int survivor the survivor client that killed the boomer + * @param int boomer the infected client that got popped + * @param int shoveCount the amount of times the boomer got shoved, if any + * @param Float timeAlive the time, in seconds, that the boomer lived + */ +forward void OnBoomerPop( int survivor, int oomer, int hoveCount, float timeAlive ); + +/** + * Called whenever a charger is fully melee-leveled (no chip). + * This is also called when the melee hit would've leveled if not chipped! + * + * @param int survivor the survivor client that performed the feat + * @param int charger the infected client that underwent it + */ +forward void OnChargerLevel( int survivor, int charger ); + +/** + * Called whenever a charger is melee-leveled after being chipped. + * Only called when the melee wouldn't have killed an unchipped charger. + * + * @param int survivor the survivor client that performed the feat + * @param int charger the infected client that underwent it + * @param int damage damage done in the killing hit + */ +forward void OnChargerLevelHurt( int survivor, int charger, int damage ); + +/** + * Called whenever a witch was crowned without her being angered first. + * + * @param int survivor the survivor client that performed the feat + * @param int damage damage done in the killing hit + */ +forward void OnWitchCrown( int survivor, int damage ); + +/** + * Called whenever a witch gets crowned after she got angered/triggered. + * This is referred to (depending on the community) as a 'draw crown' or 'remote'. + * + * @param int survivor the survivor client that performed the feat + * @param int damage damage done in the killing hit + * @param int chipdamage damage done to the witch before she got crowned + */ +forward void OnWitchCrownHurt( int survivor, int damage, int chipdamage ); + +/** + * Called whenever a survivor melee-cuts a smoker tongue that was aimed for them. + * + * @param int survivor the survivor client that performed the feat + * @param int smoker the infected client that underwent it + */ +forward void OnTongueCut( int survivor, int smoker ); + +/** + * Called whenever a survivor frees himself from a smoker that grabbed them, + * either by killing it or by shoving. + * + * @param int survivor the survivor client that performed the feat + * @param int smoker the infected client that underwent it + * @param bool withShove true if the self-clear was by a shove/m2 + */ +forward void OnSmokerSelfClear( int survivor, int smoker, bool withShove ); + +/** + * Called whenever a survivor shoots/melees a tank rock out of the air. + * + * Note: the tank param might be unreliable due to the nature of the + * tracking. Don't do anything srs bsns with it. + * + * @param int survivor the survivor client that performed the feat + * @param int tank the infected client that underwent it + */ +forward void OnTankRockSkeeted( int survivor, int tank ); + +/** + * Called whenever a tank lands a rock on a survivor. + * + * Note: the tank param might be unreliable due to the nature of the + * tracking. Don't do anything srs bsns with it. + * + * @param int tank the infected client that performed the feat + * @param int survivor the survivor client that underwent it + */ +forward void OnTankRockEaten( int tank, int survivor ); + +/** + * Called whenever a hunter lands a high-pounce on a survivor. + * + * @param int hunter the infected client that performed the feat + * @param int survivor the survivor client that underwent it + * @param int actualDamage the actual damage the pounce did to the survivor + * @param Float calculatedDamage how much damage (going by pounceannounce parameters) the pounce would be expected to do + * @param Float height the vertical distance between the pounce origin and its landing + * @param bool reportedHigh whether skill_detect considers it a high pounce for reporting purposes + */ +forward void OnHunterHighPounce( int hunter, int survivor, int actualDamage, float calculatedDamage, float height, bool reportedHigh ); + +/** + * Called whenever a jockey lands a high-pounce on a survivor. + * + * Note: due to the nature of the tracking, it only gets the height right if a jockey actually + * jumped or pounced from his perch. If they simple walk off and land, it may be incorrect. + * + * @param int jockey the infected client that performed the feat + * @param int survivor the survivor client that underwent it + * @param Float height the vertical distance between the pounce origin and its landing + * @param bool reportedHigh whether skill_detect considers it a high pounce for reporting purposes + */ +forward void OnJockeyHighPounce( int jockey, int victim, float height, bool reportedHigh ); + +/** + * Called whenever a charger lands a death-charge on a survivor. + * This is called for killing the grabbed survivor, but also the ones that get impact-bumped + * and fall to their deaths. + * + * Note: due to the nature of the tracking, there may be places that are technically death- + * charge spots, but not detected by the plugin. Example: the sidewalk next to the fence near + * the lower roof on Dead Air 1; the Death Toll 4 out-of-map deathcharge near the start + * saferoom. + * + * @param int charger the infected client that performed the feat + * @param int survivor the survivor client that underwent it + * @param Float height the vertical distance between the grab and the survivor's death spot + * @param Float distance the full vector distance between the grab and the survivor's death spot + * @param bool wasCarried true if the survivor was the one that the charger grabbed + */ +forward void OnDeathCharge( int charger, int survivor, float height, float distance, bool wasCarried ); + +/** + * Called whenever a survivor clears a teammate from a special infected pin. + * + * Note: timeB is only appliccable for smokers and chargers. For smokers it shows the + * time from the tongue connecting to the clear. For chargers from the charge-grab to + * the clear. For jockeys and hunters, timeB will always be -1.0. + * + * timeA is the time, for charger, from start of pummeling till clear (-1.0 if they + * never started pummeling). For smokers, this is the time from the survivor being + * fully reigned in to the smoker (-1.0 if the tongue was broken before that). + * + * @param int clearer the survivor client that performed the clear + * @param int pinner the pinning infected client that got cleared (shoved off or killed) + * @param int pinvictim the pinned survivor that was saved + * @param int zombieClass the class (ZC_SMOKER - ZC_CHARGER) of the pinner + * @param Float timeA time from pin till clear in seconds, -1 if never + * @param Float timeB for charger/smoker: time from grab/tongue connect to clear + * @param bool withShove true if the clear was done by shove/m2 + */ +forward void OnSpecialClear( int clearer, int pinner, int pinvictim, int zombieClass, float timeA, float timeB, bool withShove ); + +/** + * Called whenever a boomer is done vomiting, and landed his vomit on one + * or more survivors. + * + * Note: this does not include or fire for boomers exploding, only vomits. + * + * @param int boomer the infected client that performed the feat + * @param int amount the amount of survivors vomited on + */ +forward void OnBoomerVomitLanded( int boomer, int amount ); + +/** + * Called whenever a survivor shoves a special infected (any kind). + * + * @param int survivor the survivor client that performed the feat + * @param int infected the infected client that underwent it + * @param int zombieClass the class type of the infected shoved + */ +forward void OnSpecialShoved( int survivor, int infected, int zombieClass ); + +/** + * Called whenever a survivor lands any number of bunnyhops in a row. Called + * afterwards. + * + * @param int survivor the survivor client that performed the feat + * @param int streak the amount of hops in a row + * @param Float maxVelocity the highest speed during any jump or jump apex + */ +forward void OnBunnyHopStreak( int survivor, int streak, float maxVelocity ); + +/** + * Called whenever a car alarm is triggered (by a survivor). + * + * @param int survivor the survivor client that triggered the alarm (-1 or 0 if unknown) + * @param int infected if > 0: the infected client that assisted in triggering it (boomer, smoker, jockey or charger) + * @param int reason the reason for triggering (see CarAlarmTriggerType) + */ +forward void OnCarAlarmTriggered( int survivor, int infected, CarAlarmTriggerReason reason ); + + +public SharedPlugin __pl_skilldetect = +{ + name = "skill_detect", + file = "l4d2_skill_detect.smx", +#if defined REQUIRE_PLUGIN + required = 1, +#else + required = 0, +#endif +}; + diff --git a/scripting/include/l4d_info_editor.inc b/scripting/include/l4d_info_editor.inc new file mode 100644 index 0000000..0bce55b --- /dev/null +++ b/scripting/include/l4d_info_editor.inc @@ -0,0 +1,54 @@ +#if defined _info_editor_included + #endinput +#endif +#define _info_editor_included + + + +/** + * Retrieves the value of a specified key from the games mission info keyvalue system. "N/A" is returned when not found. + * + * @param pThis Enter the pThis value from OnGetMissionInfo/OnGetWeaponsInfo. Can specify 0 when reading Mission data. + * @param keyname Key name to check. + * @param dest Destination string buffer to copy to. + * @param destLen Destination buffer length (includes null terminator). + * + * @noreturn + */ +native void InfoEditor_GetString(int pThis, const char[] keyname, char[] dest, int destLen); + +/** + * Sets the value of a specified key from the games mission info keyvalue system. + * + * @param pThis Enter the pThis value from OnGetMissionInfo/OnGetWeaponsInfo. Can specify 0 when writing Mission data. + * @param keyname Key name to set. + * @param value Value to set. + * @param create Optionally create the keyvalue if it doesn't exist. + * + * @noreturn + */ +native void InfoEditor_SetString(int pThis, const char[] keyname, const char[] value, bool create = false); + +/** + * Reloads the mission and weapons data configs and forces the game to reload them. + * + * @noreturn + */ +native void InfoEditor_ReloadData(); + + + +/** + * @brief Fired multiple times when the mission info data is parsed. + * + * @param pThis This pointer used for InfoEditor_GetString/InfoEditor_SetString. + */ +forward void OnGetMissionInfo(int pThis); + +/** + * Fired multiple times when the weapon info data is parsed for a specific weapon classname. + * + * @param pThis This pointer used for InfoEditor_GetString/InfoEditor_SetString. + * @param classname Classname of the weapon being parsed. + */ +forward void OnGetWeaponsInfo(int pThis, const char[] classname); \ No newline at end of file diff --git a/scripting/include/l4d_survivor_identity_fix.inc b/scripting/include/l4d_survivor_identity_fix.inc index c0d7078..53802f5 100644 --- a/scripting/include/l4d_survivor_identity_fix.inc +++ b/scripting/include/l4d_survivor_identity_fix.inc @@ -8,17 +8,17 @@ enum Character { Character_Zoey, Character_Louis } -native int IdentityFix_SetPlayerModel(int client, int args); +native int IdentityFix_SetPlayerModel(int client, int args, bool keep = false); static bool nativeAvailable, nativeTested; -bool UpdatePlayerIdentity(int client, Character character) { +bool UpdatePlayerIdentity(int client, Character character, bool keep = false) { if(!nativeTested) { nativeTested = true; nativeAvailable = GetFeatureStatus(FeatureType_Native, "IdentityFix_SetPlayerModel") == FeatureStatus_Available; } if(nativeAvailable) { - int result = IdentityFix_SetPlayerModel(client, view_as(character)); + int result = IdentityFix_SetPlayerModel(client, view_as(character), keep); return result == 0; }else{ return false; diff --git a/scripting/include/left4dhooks.inc b/scripting/include/left4dhooks.inc index a2d1963..8db8507 100644 --- a/scripting/include/left4dhooks.inc +++ b/scripting/include/left4dhooks.inc @@ -88,6 +88,7 @@ public void __pl_l4dh_SetNTVOptional() MarkNativeAsOptional("L4D_IsInFirstCheckpoint"); MarkNativeAsOptional("L4D_IsInLastCheckpoint"); MarkNativeAsOptional("L4D2_IsReachable"); + MarkNativeAsOptional("L4D_HasPlayerControlledZombies"); MarkNativeAsOptional("L4D_PipeBombPrj"); MarkNativeAsOptional("L4D2_GetVScriptOutput"); @@ -241,6 +242,7 @@ public void __pl_l4dh_SetNTVOptional() // ========================= MarkNativeAsOptional("L4D_CTerrorPlayer_OnVomitedUpon"); MarkNativeAsOptional("L4D_CancelStagger"); + MarkNativeAsOptional("L4D_RespawnPlayer"); MarkNativeAsOptional("L4D_CreateRescuableSurvivors"); MarkNativeAsOptional("L4D_ReviveSurvivor"); MarkNativeAsOptional("L4D_GetHighestFlowSurvivor"); @@ -883,9 +885,9 @@ forward void L4D2_OnWaterMove(int client); * @param client Client id to find an area near this player * @param zombieClass Special Infected class to search for a spawn position for * @param attempts How many tries to find a valid location - * @param vecPos The vector location. Sometimes is 0,0,0. Use post hook for real selected position. + * @param vecPos The vector location. Sometimes is 0,0,0. Use post hook for real selected position * - * @return Plugin_Changed to change any values, Plugin_Continue otherwise. + * @return Plugin_Changed to change any values, Plugin_Continue otherwise */ #pragma deprecated Removed because it spawns specials at 0,0,0 when modifying any value. forward Action L4D_OnGetRandomPZSpawnPosition(int &client, int &zombieClass, int &attempts, float vecPos[3]); @@ -962,7 +964,7 @@ native int L4D_AngularVelocity(int entity, const float vecAng[3]); * @remarks The zombieClass does not matter but different values yield different results: * @remarks Using the Tank zombieClass probably searches for a larger area that's clear of objects * - * @param client Client id to find an area near this player + * @param client Client id to find an area near this player. Accepts 0 to find a random area instead * @param zombieClass Special Infected class to search for a spawn position for * @param attempts How many tries to find a valid location * @param vecPos The vector array to store the valid location on success @@ -1032,8 +1034,9 @@ native bool L4D_IsInFirstCheckpoint(int client); native bool L4D_IsInLastCheckpoint(int client); /** - * @brief Checks if a world position is accessible to a player. - * @remarks You can pass any client index into this (real or fake players, survivors or special infected). + * @brief Checks if a world position is accessible to a Survivor bot. + * @remarks You must pass a survivor bots client index into this, otherwise the plugin will attempt to find a bot or throw an error otherwise. + * @remarks It appears the server will sometimes crash when passing a real players client index. * @remarks If the clients flow distance is too far away from the position to test it will return false. * * @param client Client id to use for testing @@ -1044,6 +1047,13 @@ native bool L4D_IsInLastCheckpoint(int client); // L4D2 only. native bool L4D2_IsReachable(int client, const float vecPos[3]); +/** + * @brief Returns if players can control infected + * + * @return True if players can control infected, false otherwise + */ +native bool L4D_HasPlayerControlledZombies(); + /** * @brief Creates an activated PipeBomb projectile * @remarks Does not attach the "Fuse" or "Light" particles, see the "left4dhooks_test" plugin for example on attaching these @@ -2604,6 +2614,15 @@ native void L4D2_CTerrorPlayer_Fling(int client, int attacker, float vecDir[3]); */ native void L4D_CancelStagger(int client); +/** + * @brief Respawns a player from dead state. + * + * @param client Client ID of the person to affect + * + * @noreturn + */ +native void L4D_RespawnPlayer(int client); + /** * @brief Spawns all dead survivors in rescuable rooms. * @remarks L4D1: Any survivor must not be in the starting area for it to work. diff --git a/scripting/include/sceneprocessor.inc b/scripting/include/sceneprocessor.inc new file mode 100644 index 0000000..8a07a18 --- /dev/null +++ b/scripting/include/sceneprocessor.inc @@ -0,0 +1,283 @@ +#if defined _sceneprocessor_included + #endinput +#endif +#define _sceneprocessor_included + +#define MAX_SCENEFILE_LENGTH PLATFORM_MAX_PATH // Maximum length of scene files +#define MAX_VOCALIZE_LENGTH 128 // Maximum length of vocalize strings + +#define SCENE_INITIATOR_WORLD 0 /* All scenes created by the map (such as landmarks, "Down this way", "Through here") + * and by the game (such as team mate actions, "Let me heal you up", "Help I'm falling") + * are marked as started by the world, or entity index 0. */ +#define SCENE_INITIATOR_PLUGIN -1 /* All scenes started by the Scene Processor are by default marked as started by plugin or + * entity index -1. This can be changed in the PerformScene function call. */ + +#define DEFAULT_SCENE_PREDELAY 0.0 /* By default all scenes occur the instant they are created */ +#define DEFAULT_SCENE_PITCH 1.0 /* By default all scenes have a pitch of 1.0, or as they are normally heard. 2.0 will make + * it sounds twice as fast but in a high pitched voice. 0.5 will be half the normal speed + * and with low pitched voice. */ + +enum SceneStages +{ + SceneStage_Unknown = 0, /* Scene has not been created nor processed. Either something went wrong, the + * scene is not valid, incorrectly formatted, or a round just started recently. */ + + SceneStage_Created = 1, /* When scene is created. Contains no information about the scene that is about to + * be played out. Guaranteed to occur. */ + + SceneStage_Spawned, /* When scene is spawned. Everything is filled in but the pre-delay! Change scene + * pitch and pre-delay here. */ + + SceneStage_SpawnedPost, /* Post scene spawned frame. Pre-delay is now filled out. Pre-delay can be changed + * here if the scene originally has a pre-delay greater than 0.0. */ + + SceneStage_Started, /* When scene is started. Time stamp is set. */ + + SceneStage_Cancelled, /* When scene is cancelled. Happens if the Survivor was interrupted by another scene + * or the scene was cancelled post starting. */ + + SceneStage_Completion, /* When scene is completed. Happens if the Survivor gets to fully perform the scene + * with no interruptions or cancellation. Entity index is no longer valid but + * information is retained. */ + + SceneStage_Killed /* When scene is killed. Entity index is no longer valid but information is retained + * until end of forward. Guaranteed to occur */ +}; + +/** + * Called on scene stage changed. + * + * @param scene Scene entity index. + * @param stage SceneStages value. + * @noreturn + */ +forward void OnSceneStageChanged(int scene, SceneStages stage); + +/** + * Called on vocalize command send. + * + * @remarks See SCENE_INITIATOR_WORLD and SCENE_INITIATOR_PLUGIN for + * non-client initiated vocalizes. + * + * @param client Index of player sending vocalize command. + * @param vocalize String of what player wish to vocalize, as typed. + * @param initiator Index of entity initiated vocalize command. + * @return Plugin_Stop to stop vocalize command. + * Plugin_Continue to allow vocalize command. + */ +forward Action OnVocalizationProcess(int client, const char[] vocalize, int initiator); + +/** + * Returns scene stage. + * + * @param scene Scene entity index. + * @return SceneStages value or 0 if scene is not valid. + */ +native SceneStages GetSceneStage(int scene); + +/** + * Returns whether scene is valid as a scene. + * + * @remarks The scene entity index may still be invalid. + * + * @param scene Scene entity index. + * @return True if a valid scene, false otherwise. + */ +stock bool IsValidScene(int scene) +{ + return GetSceneStage(scene) != SceneStage_Unknown; +} + +/** + * Returns scene start time stamp, in engine time. + * + * @param scene Scene entity index. + * @return Scene start engine time stamp. 0.0 if the scene has not started yet. + */ +native float GetSceneStartTimeStamp(int scene); + +/** + * Returns scene actor. + * + * @param scene Scene entity index. + * @return Actor of the scene. 0 if no one is playing it. + */ +native int GetActorFromScene(int scene); + +/** + * Returns actor's scene. + * + * @remarks Only returns scene if it is currently being played out. + * + * @param actor Client index of actor. + * @return Scene entity index. INVALID_ENT_REFERENCE if actor currently aren't playing. + */ +native int GetSceneFromActor(int actor); + +/** + * Returns whether actor is already playing a scene. + * + * @param actor Client index of actor. + * @return True if actor is busy, false otherwise. + */ +stock bool IsActorBusy(int actor) +{ + return GetSceneFromActor(actor) != INVALID_ENT_REFERENCE; +} + +/** + * Returns scene initiator. + * + * @remarks See SCENE_INITIATOR_WORLD and SCENE_INITIATOR_PLUGIN for automated + * scenes. + * + * @param scene Scene entity index. + * @return Initiator of the scene. + */ +native int GetSceneInitiator(int scene); + +/** + * Returns scene file. + * + * @param scene Scene entity index. + * @param dest Destination string buffer to copy to. + * @param len Destination buffer length (includes null terminator). + * @return Number of bytes written + */ +native int GetSceneFile(int scene, char[] dest, int len); + +/** + * Returns scene vocalize. + * + * @remarks Will only contain the vocalize string if the scene was started by + * the client them self. Otherwise empty. + * + * @param scene Scene entity index. + * @param dest Destination string buffer to copy to. + * @param len Destination buffer length (includes null terminator). + * @return Number of bytes written + */ +native int GetSceneVocalize(int scene, char[] dest, int len); + +/** + * Returns scene pre-delay. + * + * @remarks Sadly pre-delay is first fetched on SceneStage_SpawnedPost where + * altering the pre-delay with SetScenePreDelay might already be too late. + * + * @param scene Scene entity index. + * @return Scene pre-delay in seconds. + */ +native float GetScenePreDelay(int scene); + +/** + * Sets scene pre-delay. + * + * @remarks Pre-delay can be set on SceneStage_Spawned and sometimes (!) on + * SceneStage_SpawnedPost depending on whether the scene originally has a + * pre-delay. Once SceneStage_Started fires pre-delay is no longer obeyed. + * + * @param scene Scene entity index. + * @param preDelay Scene pre-delay in seconds. + * @noreturn + */ +native void SetScenePreDelay(int scene, float preDelay); + +/** + * Returns scene pitch. + * + * @param scene Scene entity index. + * @return Scene pitch. + */ +native float GetScenePitch(int scene); + +/** + * Sets scene pitch + * + * @remarks Scene pitch can be set on SceneStage_Spawned and + * SceneStage_SpawnedPost. Setting pitch post spawning results in weird + * settings such as some clients hearing 1.13 as double as fast instead of 2.0. + * + * @param scene Scene entity index. + * @param pitch Scene pitch. + * @noreturn + */ +native void SetScenePitch(int scene, float pitch); + +/** + * Cancels scene. + * + * @remarks Can be used at all scene stages. Scene is validated before sending + * the cancel input. + * + * @param scene Scene entity index. + * @noreturn + */ +native void CancelScene(int scene); + +/** + * Performs a scene. + * + * @remarks Scene file is used before vocalize string however vocalize string + * is still saved to scene entity index and can be retrieved for later usage. + * If vocalize string is used, it is delayed for a short while in order to + * work if used inside of OnSceneStageChanged. See PerformSceneEx to avoid + * this delay. + * + * @param client Client index. + * @param vocalize Vocalize string. + * @param file Scene file. + * @param preDelay Scene pre-delay. + * @param pitch Scene pitch. + * @param initiator Initiator of the scene. + * @noreturn + */ +native void PerformScene(int client, const char[] vocalize, const char[] file = "", float preDelay = DEFAULT_SCENE_PREDELAY, float pitch = DEFAULT_SCENE_PITCH, int initiator = SCENE_INITIATOR_PLUGIN); + +/** + * Performs a scene. + * + * @remarks Works the same way as PerformScene however there is no delay when + * using vocalize string. Not recommend to use inside OnSceneStageChanged if + * vocalizes needs to get through. + * + * @param client Client index. + * @param vocalize Vocalize string. + * @param file Scene file. + * @param preDelay Scene pre-delay. + * @param pitch Scene pitch. + * @param initiator Initiator of the scene. + * @noreturn + */ +native void PerformSceneEx(int client, const char[] vocalize, const char[] file = "", float preDelay = DEFAULT_SCENE_PREDELAY, float pitch = DEFAULT_SCENE_PITCH, int initiator = SCENE_INITIATOR_PLUGIN); + +public SharedPlugin __pl_sceneproces = +{ + name = "sceneprocessor", + file = "sceneprocessor.smx", +#if defined REQUIRE_PLUGIN + required = 1, +#else + required = 0, +#endif +}; + +#if !defined REQUIRE_PLUGIN +public void __pl_sceneproces_SetNTVOptional() +{ + MarkNativeAsOptional("GetSceneStage"); + MarkNativeAsOptional("GetSceneStartTimeStamp"); + MarkNativeAsOptional("GetActorFromScene"); + MarkNativeAsOptional("GetSceneFromActor"); + MarkNativeAsOptional("GetSceneInitiator"); + MarkNativeAsOptional("GetSceneFile"); + MarkNativeAsOptional("GetSceneVocalize"); + MarkNativeAsOptional("GetScenePreDelay"); + MarkNativeAsOptional("SetScenePreDelay"); + MarkNativeAsOptional("GetScenePitch"); + MarkNativeAsOptional("SetScenePitch"); + MarkNativeAsOptional("CancelScene"); + MarkNativeAsOptional("PerformScene"); + MarkNativeAsOptional("PerformSceneEx"); +} +#endif \ No newline at end of file diff --git a/scripting/include/smlib.inc b/scripting/include/smlib.inc new file mode 100644 index 0000000..2d6413a --- /dev/null +++ b/scripting/include/smlib.inc @@ -0,0 +1,32 @@ +#if defined _smlib_included + #endinput +#endif +#define _smlib_included + +#define SMLIB_VERSION "0.9.7" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//#include +#include +#include +#include +#include +#include +#include +#include diff --git a/scripting/l4d2-info-cmd.sp b/scripting/l4d2-info-cmd.sp index 6b2fe5b..c43d27b 100644 --- a/scripting/l4d2-info-cmd.sp +++ b/scripting/l4d2-info-cmd.sp @@ -17,6 +17,7 @@ char g_icCurrentMap[32]; int g_icPlayerManager; //entid -> typically 25 (MaxClients+1) +static bool b_isTransitioning[MAXPLAYERS+1]; bool g_icHealing[MAXPLAYERS+1]; //state bool g_icBeingHealed[MAXPLAYERS+1]; //state @@ -29,6 +30,7 @@ public Plugin myinfo = url = "" }; +//TODO: Transition state public OnPluginStart() { @@ -45,6 +47,9 @@ public OnPluginStart() //HookEvent("heal_end", Event_HealStop); HookEvent("heal_success", Event_HealStop); HookEvent("heal_interrupted", Event_HealStop); + //For transitioning: + HookEvent("map_transition", Event_MapTransition); + HookEvent("player_spawn", Event_PlayerSpawn); //hook cvars, game info states FindConVar("z_difficulty").GetString(g_icDifficulty, sizeof(g_icDifficulty)); @@ -59,12 +64,13 @@ public OnPluginStart() // print info public Action PrintGameInfo(int client, int args) { //print server info - ReplyToCommand(client, ">map,diff,mode,tempoState,totalSeconds"); + ReplyToCommand(client, ">map,diff,mode,tempoState,totalSeconds,hastank"); int missionDuration = GetEntProp(g_icPlayerManager, Prop_Send, "m_missionDuration", 1); int tempoState = GetEntProp(g_icPlayerManager, Prop_Send, "m_tempoState", 1); - ReplyToCommand(client, "%s,%s,%s,%d,%d",g_icCurrentMap,g_icDifficulty,g_icGamemode,tempoState,missionDuration); + bool hasTank = false; + ReplyToCommand(client, "%s,%s,%s,%d,%d,%b",g_icCurrentMap,g_icDifficulty,g_icGamemode,tempoState,missionDuration,hasTank); //print client info - ReplyToCommand(client,">id,name,bot,health,status,throwSlot,kitSlot,pillSlot,survivorType,velocity,primaryWpn,secondaryWpn"); + ReplyToCommand(client,">id,transitioning,name,bot,health,status,throwSlot,kitSlot,pillSlot,survivorType,velocity,primaryWpn,secondaryWpn"); char status[9]; char name[32]; char pillItem[32]; @@ -73,7 +79,12 @@ public Action PrintGameInfo(int client, int args) { char character[9]; char primaryWeapon[32], secondaryWeapon[32]; for (int i = 1; i <= MaxClients; i++) { - if (!IsClientInGame(i)) continue; + if(!IsClientConnected(i)) continue; + if(!IsClientInGame(i)) { + if(b_isTransitioning[i]) + ReplyToCommand(client,"%d,1", i); + else continue; + } if (GetClientTeam(i) != 2) continue; int hp = GetClientRealHealth(i); int bot = IsFakeClient(i); @@ -101,6 +112,7 @@ public Action PrintGameInfo(int client, int args) { throwItem[0] = '\0'; kitItem[0] = '\0'; pillItem[0] = '\0'; + //TODO: Move all string-based stats to events GetItemSlotClassName(i, 0, primaryWeapon, sizeof(primaryWeapon), true); GetItemSlotClassName(i, 1, secondaryWeapon, sizeof(secondaryWeapon), true); GetItemSlotClassName(i, 2, throwItem, sizeof(throwItem), true); @@ -114,7 +126,7 @@ public Action PrintGameInfo(int client, int args) { GetClientName(i, name, sizeof(name)); GetModelName(i, character, sizeof(character)); - ReplyToCommand(client,"%d,%s,%d,%d,%s,%s,%s,%s,%s,%d,%s,%s", i, name, bot, hp, status, throwItem, kitItem, pillItem, character, velocity, primaryWeapon, secondaryWeapon); + ReplyToCommand(client,"%d,0,%s,%d,%d,%s,%s,%s,%s,%s,%d,%s,%s", i, name, bot, hp, status, throwItem, kitItem, pillItem, character, velocity, primaryWeapon, secondaryWeapon); } } @@ -122,7 +134,20 @@ public Action PrintGameInfo(int client, int args) { public void Event_GamemodeChange(ConVar cvar, const char[] oldValue, const char[] newValue) { cvar.GetString(g_icGamemode, sizeof(g_icGamemode)); } +public Action Event_MapTransition(Event event, const char[] name, bool dontBroadcast) { + for(int i = 1; i <= MaxClients; i++) { + if(IsClientConnected(i) && IsClientInGame(i) && GetClientTeam(i) == 2) + b_isTransitioning[i] = true; + } +} +public Action Event_PlayerSpawn(Event event, const char[] name, bool dontBroadcast) { + int client = GetClientOfUserId(event.GetInt("userid")); + if(client && b_isTransitioning[client]) { + b_isTransitioning[client] = false; + } +} public void OnMapStart() { + //TODO: turn off when over threshold, OR fancier logic (per player) GetCurrentMap(g_icCurrentMap, sizeof(g_icCurrentMap)); //grab the player_manager //int playerManager; diff --git a/scripting/l4d2-manual-director.sp b/scripting/l4d2-manual-director.sp index 2d4c9d0..4e173f6 100644 --- a/scripting/l4d2-manual-director.sp +++ b/scripting/l4d2-manual-director.sp @@ -14,6 +14,25 @@ ConVar g_cMdNotify, g_cMdEnableTank, g_cMdEnableWitch, g_cMdEnableMob, g_cMdAnnounceLevel; bool g_bMdIsL4D2 = false; +int g_icSpawnStats[15]; +/* +0 - Commons +1 - Mob +2 - Panics +3 - Jockey +4 - Hunter +5 - Charger +6 - Smoker +7 - Spitter +8 - Boomer +9 - Witch +10 - Tank +11 - Weapons +12 - Health +13 - Throwables +14 - Restarts (cvar?) +*/ + public Plugin myinfo = { name = PLUGIN_NAME, @@ -59,13 +78,18 @@ public void OnPluginStart() } public Action Command_SpawnSpecial(int client, int args) { - char arg1[32]; + char arg1[32], arg2[4]; GetCmdArg(1, arg1, sizeof(arg1)); + GetCmdArg(2, arg2, sizeof(arg2)); + int amount = StringToInt(arg2); + if(amount == 0) amount = 1; int executioner = GetAnyValidClient(); if (args < 1) { - ReplyToCommand(client, "[SM] Usage: sm_spawnspecial - Requests a special to spawn via director", arg1); + ReplyToCommand(client, "[SM] Usage: sm_spawnspecial [amount] - Requests a special to spawn via director", arg1); } else { - if (executioner <= 0) { + if(amount <= 0 || amount >= MaxClients) { + ReplyToCommand(client, "[SM] Amount specified is out of range of 1 to %d", MaxClients); + }else if (executioner <= 0) { ReplyToCommand(client, "[SM] Cannot spawn a %s as there are no players online.", arg1); } else { if (StrEqual(arg1, "mob", false) && !g_cMdEnableMob.BoolValue) { @@ -78,56 +102,72 @@ public Action Command_SpawnSpecial(int client, int args) { if(StrEqual(arg1,"panic",false)) { CheatCommand(executioner, "director_force_panic_event", "", ""); }else{ - CheatCommand(executioner, g_bMdIsL4D2 ? "z_spawn_old" : "z_spawn", arg1, "auto"); + CheatCommandMultiple(executioner, amount, g_bMdIsL4D2 ? "z_spawn_old" : "z_spawn", arg1, "auto"); } if (g_cMdNotify.BoolValue) { - ReplyToCommand(client, "[SM] Director will now attempt to spawn a %s.", arg1); + ReplyToCommand(client, "[SM] Director will now attempt to spawn %dx %s.", amount, arg1); } AnnounceSpawn(arg1); - LogAction(client, -1, "\"%L\" spawned a \"%s\"", client, arg1); + ShowActivity(client, "spawned %dx \"%s\"", amount, arg1); } } } return Plugin_Handled; } public Action Command_SpawnSpecialForceLocal(int client, int args) { - char arg1[32]; - GetCmdArg(1, arg1, sizeof(arg1)); - if (args < 1) { - ReplyToCommand(client, "[SM] Usage: sm_forcecursor - Requests a special to spawn at cursor", arg1); - } else { + if(client == 0) { + ReplyToCommand(client, "[SM] This command can only be used as a player."); + return Plugin_Handled; + } + char arg1[32], arg2[4]; + GetCmdArg(1, arg1, sizeof(arg1)); + GetCmdArg(2, arg2, sizeof(arg2)); + int amount = StringToInt(arg2); + if(amount == 0) amount = 1; + if (args < 1) { + ReplyToCommand(client, "[SM] Usage: sm_forcecursor [amount] - Requests a special to spawn at cursor", arg1); + } else if(amount <= 0 || amount >= MaxClients) { + ReplyToCommand(client, "[SM] Amount specified is out of range of 1 to %d", MaxClients); + }else { if(StrEqual(arg1,"panic",false)) { - CheatCommand(client, "director_force_panic_event", "", ""); + CheatCommand(client, "director_force_panic_event", "", ""); }else{ - int bot = CreateFakeClient("ManualDirectorBot"); - if (bot != 0) { - ChangeClientTeam(bot, 3); - CreateTimer(0.1, kickbot, bot); - } - CheatCommand(client, g_bMdIsL4D2 ? "z_spawn_old" : "z_spawn", arg1,""); - } - if (g_cMdNotify.BoolValue) { - ReplyToCommand(client, "[SM] Spawned a %s.", arg1); - } - AnnounceSpawn(arg1); - LogAction(client, -1, "\"%L\" spawned a \"%s\"", client, arg1); + for(int i = 0; i < amount; i++) { + int bot = CreateFakeClient("ManualDirectorBot"); + if (bot != 0) { + ChangeClientTeam(bot, 3); + CreateTimer(0.1, kickbot, bot); + } + CheatCommand(client, g_bMdIsL4D2 ? "z_spawn_old" : "z_spawn", arg1,""); + } + } + if(g_cMdNotify.BoolValue) { + ReplyToCommand(client, "[SM] Spawned %dx %s.", amount, arg1); + } + AnnounceSpawn(arg1); + ShowActivity(client, "cursor spawned %dx \"%s\"", amount, arg1); } return Plugin_Continue; } public Action Command_SpawnSpecialForce(int client, int args) { - char arg1[32]; + char arg1[32], arg2[4]; GetCmdArg(1, arg1, sizeof(arg1)); + GetCmdArg(2, arg2, sizeof(arg2)); + int amount = StringToInt(arg2); + if(amount == 0) amount = 1; int executioner = GetAnyValidClient(); if (args < 1) { ReplyToCommand(client, "[SM] Usage: sm_forcespecial - Requests a special to spawn via director", arg1); - } else { - if (executioner <= 0) { - ReplyToCommand(client, "[SM] Cannot spawn a %s as there are no players online.", arg1); - } else { - if(StrEqual(arg1,"panic",false)) { - CheatCommand(executioner, "director_force_panic_event", "", ""); - }else{ + } else if (executioner <= 0) { + ReplyToCommand(client, "[SM] Cannot spawn a %s as there are no players online.", arg1); + } else if(amount <= 0 || amount >= MaxClients) { + ReplyToCommand(client, "[SM] Amount specified is out of range of 1 to %d", MaxClients); + }else { + if(StrEqual(arg1,"panic",false)) { + CheatCommand(executioner, "director_force_panic_event", "", ""); + }else{ + for(int i = 0; i < amount; i++) { int bot = CreateFakeClient("ManualDirectorBot"); if (bot != 0) { ChangeClientTeam(bot, 3); @@ -135,12 +175,12 @@ public Action Command_SpawnSpecialForce(int client, int args) { } CheatCommand(executioner, g_bMdIsL4D2 ? "z_spawn_old" : "z_spawn", arg1, "auto"); } - if (g_cMdNotify.BoolValue) { - ReplyToCommand(client, "[SM] Spawned a %s.", arg1); - } - AnnounceSpawn(arg1); - LogAction(client, -1, "\"%L\" spawned a \"%s\"", client, arg1); } + if (g_cMdNotify.BoolValue) { + ReplyToCommand(client, "[SM] Spawned a %dx %s.", amount, arg1); + } + AnnounceSpawn(arg1); + ShowActivity(client, "forced spawned %dx \"%s\"", amount, arg1); } return Plugin_Handled; } @@ -163,14 +203,16 @@ public Action ShowSpecialMenu(int client, int args) { menu.Display(client, 0); } public Action ShowLocalSpecialMenu(int client, int args) { - Menu menu = new Menu(Handle_LocalSpawnMenu); - menu.SetTitle("Manual Director - Cursor"); - menu.AddItem("common", "Single Common"); - if (g_bMdIsL4D2) { + Menu menu = new Menu(Handle_LocalSpawnMenu); + menu.SetTitle("Manual Director - Cursor"); + menu.AddItem("common", "Single Common"); + + if (g_bMdIsL4D2) { menu.AddItem("jockey", "Jockey"); menu.AddItem("charger", "Charger"); menu.AddItem("spitter", "Spitter"); } + menu.AddItem("hunter", "Hunter"); menu.AddItem("smoker", "Smoker"); menu.AddItem("boomer", "Boomer"); @@ -229,14 +271,33 @@ stock Action kickbot(Handle timer, int client) if (IsFakeClient(client))KickClient(client); } } +int FindStatIndex(const char[] type) { + return SpawnStats + if (StrEqual(type, "common") return 0; + else if (StrEqual(type, "mob")) return 1; + else if (StrEqual(type, "panic")) return 2; + else if (StrEqual(type, "jockey")) return 3; + else if (StrEqual(type, "hunter")) return 4; + else if (StrEqual(type, "charger")) return 5; + else if (StrEqual(type, "smoker")) return 6; + else if (StrEqual(type, "spitter")) return 7; + else if (StrEqual(type, "boomer")) return 8; + else if (StrEqual(type, "witch")) return 9; + else if (StrEqual(type, "tank")) return 10; + else if (StrEqual(type, "weapon")) return 11; + else if (StrEqual(type, "health")) return 12; + else if (StrEqual(type, "throwable")) return 13; + else if (StrEqual(type, "restart")) return 14; + else return sizeof(g_icSpawnStats); +} +stock void UpdateIndex(char[] type) { + int index = FindStatIndex(type); + g_icSpawnStats[index]++; +} - -stock int GetAnyValidClient() -{ - for (int i = 1; i <= MaxClients; i++) - { - if (IsClientInGame(i) && !IsFakeClient(i)) - { +stock int GetAnyValidClient() { + for (int i = 1; i <= MaxClients; i++) { + if (IsClientInGame(i) && !IsFakeClient(i)) { return i; } } @@ -253,6 +314,18 @@ stock void CheatCommand(int client, const char[] command, const char[] argument1 SetCommandFlags(command, flags); SetUserFlagBits(client, userFlags); } +stock void CheatCommandMultiple(int client, int count, const char[] command, const char[] argument1, const char[] argument2) +{ + int userFlags = GetUserFlagBits(client); + SetUserFlagBits(client, ADMFLAG_ROOT); + int flags = GetCommandFlags(command); + SetCommandFlags(command, flags & ~FCVAR_CHEAT); + for(int i = 0; i < count; i++) { + FakeClientCommand(client, "%s %s %s", command, argument1, argument2); + } + SetCommandFlags(command, flags); + SetUserFlagBits(client, userFlags); +} void AnnounceSpawn(const char[] type) { switch(g_cMdAnnounceLevel.IntValue) { diff --git a/scripting/l4d2_ai_minigun.sp b/scripting/l4d2_ai_minigun.sp index a4f198f..648bf40 100644 --- a/scripting/l4d2_ai_minigun.sp +++ b/scripting/l4d2_ai_minigun.sp @@ -106,7 +106,7 @@ public Action Command_SpawnMinigunBot(int client, int args) { //make sure spawns a little above vPos[2] += 1.0; - int survivor = SpawnSurvivor(vPos, vAng, model, true); + int survivor = GetClientOfUserId(SpawnSurvivor(vPos, vAng, model, true)); if(survivor > 0) { GiveClientWeapon(survivor, "rifle_ak47", true); }else{ diff --git a/scripting/l4d2_feedthetrolls.sp b/scripting/l4d2_feedthetrolls.sp index 48a7f8c..1610b24 100644 --- a/scripting/l4d2_feedthetrolls.sp +++ b/scripting/l4d2_feedthetrolls.sp @@ -71,6 +71,7 @@ public void OnPluginStart() { HookEvent("player_disconnect", Event_PlayerDisconnect); HookEvent("player_death", Event_PlayerDeath); + AddNormalSoundHook(view_as(SoundHook)); AutoExecConfig(true, "l4d2_feedthetrolls"); @@ -93,6 +94,7 @@ public void OnMapEnd() { public void OnMapStart() { HookEntityOutput("func_button", "OnPressed", Event_ButtonPress); CreateTimer(MAIN_TIMER_INTERVAL_S, Timer_Main, _, TIMER_REPEAT | TIMER_FLAG_NO_MAPCHANGE); + PrecacheSound("player/footsteps/clown/concrete1.wav"); //CreateTimer(30.0, Timer_AutoPunishCheck, _, TIMER_REPEAT | TIMER_FLAG_NO_MAPCHANGE); } public void Event_PlayerDisconnect(Event event, const char[] name, bool dontBroadcast) { @@ -144,34 +146,32 @@ public Action L4D2_OnChooseVictim(int attacker, int &curTarget) { // ========================= if(hMagnetChance.FloatValue < GetRandomFloat()) return Plugin_Continue; L4D2Infected class = view_as(GetEntProp(attacker, Prop_Send, "m_zombieClass")); - if(class != L4D2Infected_Tank) { - int existingTarget = GetClientOfUserId(g_iAttackerTarget[attacker]); - if(existingTarget > 0 && IsClientInGame(existingTarget) && IsPlayerAlive(existingTarget)) { - curTarget = existingTarget; - return Plugin_Changed; - } + int existingTarget = GetClientOfUserId(g_iAttackerTarget[attacker]); + if(existingTarget > 0 && IsPlayerAlive(existingTarget)) { + curTarget = existingTarget; + return Plugin_Changed; + } - float closestDistance, survPos[3], spPos[3]; - GetClientAbsOrigin(attacker, spPos); - int closestClient = -1; - for(int i = 1; i <= MaxClients; i++) { - if(IsClientConnected(i) && IsClientInGame(i) && GetClientTeam(i) == 2 && IsPlayerAlive(i)) { - if(class == L4D2Infected_Tank && HasTrollMode(i, Troll_TankMagnet) || (class != L4D2Infected_Tank && HasTrollMode(i, Troll_SpecialMagnet))) { - GetClientAbsOrigin(i, survPos); - float dist = GetVectorDistance(survPos, spPos, true); - if(closestClient == -1 || dist < closestDistance) { - closestDistance = dist; - closestClient = i; - } + float closestDistance, survPos[3], spPos[3]; + GetClientAbsOrigin(attacker, spPos); + int closestClient = -1; + for(int i = 1; i <= MaxClients; i++) { + if(IsClientConnected(i) && IsClientInGame(i) && GetClientTeam(i) == 2 && IsPlayerAlive(i)) { + if(class == L4D2Infected_Tank && HasTrollMode(i, Troll_TankMagnet) || (class != L4D2Infected_Tank && HasTrollMode(i, Troll_SpecialMagnet))) { + GetClientAbsOrigin(i, survPos); + float dist = GetVectorDistance(survPos, spPos, true); + if(closestClient == -1 || dist < closestDistance) { + closestDistance = dist; + closestClient = i; } } } - - if(closestClient > 0) { - g_iAttackerTarget[attacker] = GetClientUserId(closestClient); - curTarget = closestClient; - return Plugin_Changed; - } + } + + if(closestClient > 0) { + g_iAttackerTarget[attacker] = GetClientUserId(closestClient); + curTarget = closestClient; + return Plugin_Changed; } return Plugin_Continue; } @@ -193,6 +193,7 @@ public Action OnClientSayCommand(int client, const char[] command, const char[] char[] message = new char[length]; ImplodeStrings(strings, 32, " ", message, length); CPrintToChatAll("{blue}%N {default}: %s", client, message); + PrintToServer("%N: %s", client, sArgs); return Plugin_Handled; }else if(HasTrollMode(client, Troll_iCantSpellNoMore)) { int type = GetRandomInt(1, 33); @@ -254,7 +255,6 @@ public Action OnClientSayCommand(int client, const char[] command, const char[] default: return Plugin_Continue; } - int strLength = strlen(sArgs); char[] newMessage = new char[strLength + 20]; int n = 0; @@ -266,6 +266,7 @@ public Action OnClientSayCommand(int client, const char[] command, const char[] } n++; } + PrintToServer("%N: %s", client, sArgs); CPrintToChatAll("{blue}%N {default}: %s", client, newMessage); return Plugin_Handled; } @@ -320,11 +321,25 @@ public Action OnPlayerRunCmd(int client, int& buttons, int& impulse, float vel[3 return Plugin_Continue; } public Action Event_TakeDamage(int victim, int& attacker, int& inflictor, float& damage, int& damagetype) { - if(attacker > 0 && attacker <= MaxClients && HasTrollMode(attacker, Troll_DamageBoost)) { + if(attacker > 0 && attacker <= MaxClients && IsClientInGame(attacker) && IsPlayerAlive(attacker) && HasTrollMode(attacker, Troll_DamageBoost)) { damage * 2; } } - +public Action SoundHook(int[] clients, int& numClients, char sample[PLATFORM_MAX_PATH], int& entity, int& channel, float& volume, int& level, int& pitch, int& flags, char[] soundEntry, int& seed) { + if(numClients > 0 && entity > 0 && entity <= MaxClients) { + if(HasTrollMode(entity, Troll_Honk)) { + if(StrContains(sample, "survivor/voice") > -1) { + strcopy(sample, sizeof(sample), "player/footsteps/clown/concrete1.wav"); + return Plugin_Changed; + } + }else if(HasTrollMode( entity, Troll_VocalizeGag)) { + if(StrContains(sample, "player\\survivor\\voice") > -1) { + return Plugin_Stop; + } + } + } + return Plugin_Continue; +} /////////////////////////////////////////////////////////////////////////////// // CVAR CHANGES /////////////////////////////////////////////////////////////////////////////// @@ -438,9 +453,7 @@ public Action Command_ListTheTrolls(int client, int args) { char modeListArr[TROLL_MODE_COUNT][32]; for(int mode = 1; mode < TROLL_MODE_COUNT; mode++) { //If troll mode exists: - bool hasTrollMode = HasTrollMode(i, view_as(mode)); - PrintToConsole(i, "[%d]: #%d %s value: %b", modes, mode, TROLL_MODES_NAMES[mode], hasTrollMode); - if(hasTrollMode) { + if(HasTrollMode(i, view_as(mode))) { modeListArr[modeCount] = TROLL_MODES_NAMES[mode]; modeCount++; } diff --git a/scripting/l4d_reservetheserver.sp b/scripting/l4d_reservetheserver.sp new file mode 100644 index 0000000..e133e75 --- /dev/null +++ b/scripting/l4d_reservetheserver.sp @@ -0,0 +1,209 @@ +#define PLUGIN_VERSION "1.1.0" +#define MAX_LINE_WIDTH 64 + +#define MESSAGE_FOR_PLAYERS_LINE1 "" +#define MESSAGE_FOR_PLAYERS_LINE2 "\x04RECEIVED SERVER RESERVATION REQUEST" +#define MESSAGE_FOR_PLAYERS_LINE3 "\x04YOU WILL BE RETURNED TO LOBBY" +#define MESSAGE_FOR_PLAYERS_LINE4 "" + +#pragma semicolon 1 + +#include + +#pragma newdecls required + +ConVar PluginCvarSearchKey, PluginCvarMode, PluginCvarTimeout, PluginCvarImmuneLevel, + SteamGroupExclusiveCvar, SearchKeyCvar, HibernationCvar; + +int HibernationCvarValue; +bool isMapChange = false, doRestartMap = false; +char PluginSearchKeyString[MAX_LINE_WIDTH] = "", PluginCvarImmuneFlagString[MAX_LINE_WIDTH] = "", CurrentMapString[MAX_LINE_WIDTH] = ""; + +public Plugin myinfo = +{ + name = "Reserve The Server", + author = "Jack'lul [Edited by Dosergen]", + description = "Frees the server from all players and reserves it.", + version = PLUGIN_VERSION, + url = "https://forums.alliedmods.net/showthread.php?p=2084993" +} + +public void OnPluginStart() { + EngineVersion g_Game = GetEngineVersion(); + if(g_Game != Engine_Left4Dead && g_Game != Engine_Left4Dead2) { + SetFailState("This plugin is for L4D/L4D2 only."); + } + + CreateConVar("l4d_rts_version", PLUGIN_VERSION, "Reserve The Server plugin version", 0|FCVAR_NOTIFY|FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_DONTRECORD); + PluginCvarMode = CreateConVar("l4d_rts_mode", "1", "0 - only remove players using lobby vote, 1 - remove players using lobby vote and then disconnect server from matchmaking", 0, true, 0.0, true, 1.0); + PluginCvarSearchKey = CreateConVar("l4d_rts_searchkey", "", "sv_search_key will be set to this while server is reserved", 0); + PluginCvarTimeout = CreateConVar("l4d_rts_timeout", "30", "How long will the server stay disconnected from matchmaking? 0 - never restore matchmaking connection", 0, true, 0.0, true, 300.0); + PluginCvarImmuneLevel = CreateConVar("l4d_rts_immunelevel", "1", "Any player >= to this level will cancel the lobby vote.", 0); + + RegAdminCmd("sm_rts", Command_MakeReservation, ADMFLAG_ROOT, "Free the server from all players, then reserve it."); + RegAdminCmd("sm_cr", Command_CancelReservation, ADMFLAG_ROOT, "Cancel reservation and make server public again."); + + SteamGroupExclusiveCvar = FindConVar("sv_steamgroup_exclusive"); + SearchKeyCvar = FindConVar("sv_search_key"); + HibernationCvar = FindConVar("sv_hibernate_when_empty"); + HibernationCvarValue = GetConVarInt(HibernationCvar); + + AutoExecConfig(true, "l4d_rts"); +} + +public void OnClientDisconnect(int client) { + if (client == 0 || isMapChange || IsFakeClient(client)) + return; + + if(doRestartMap == true) + CreateTimer(1.0, MapReloadCheck); +} + +public void OnMapEnd() { + isMapChange = true; + doRestartMap = false; +} + +public void OnMapStart() { + isMapChange = false; +} + +public Action Command_MakeReservation(int client, int args) { + int isAdminOnline = 0, notConnected = 0, iMaxClients = MaxClients; + for (int iClient = 1; iClient <= iMaxClients; iClient++) { + if (IsClientConnected (iClient) && IsClientInGame (iClient)) { + AdminId admin = GetUserAdmin(iClient); + if (GetAdminImmunityLevel(admin) >= PluginCvarImmuneLevel.IntValue) { + isAdminOnline = 1; + break; + } + } + else notConnected++; + } + + if(!isAdminOnline) + { + LogMessage("Received server reservation request."); + if(notConnected < iMaxClients) + { + if(GetConVarInt(PluginCvarMode)==1) + { + doRestartMap = true; + ReplyToCommand(client, "Server will be freed from all players and reserved."); + } + else + ReplyToCommand(client, "Server will be freed from all players."); + + PrintToChatAll(MESSAGE_FOR_PLAYERS_LINE1); + PrintToChatAll(MESSAGE_FOR_PLAYERS_LINE2); + PrintToChatAll(MESSAGE_FOR_PLAYERS_LINE3); + PrintToChatAll(MESSAGE_FOR_PLAYERS_LINE4); + + CreateTimer(5.0, FreeTheServer); + } + else if(GetConVarInt(PluginCvarMode)==1) + { + DisconnectFromMatchmaking(); + ReloadMap(); + } + } + else + ReplyToCommand(client, "Server reservation request denied - admin is online!"); + + return Plugin_Handled; +} + +public Action Command_CancelReservation(int client, int args) +{ + CreateTimer(0.1, MakeServerPublic); +} + +public Action FreeTheServer(Handle timer) +{ + CallLobbyVote(); + PassVote(); + + if(GetConVarInt(PluginCvarMode)==1) + { + DisconnectFromMatchmaking(); + } +} + +public Action MakeServerPublic(Handle timer) +{ + ConnectToMatchmaking(); + + int notConnected = 0, iMaxClients = MaxClients; + for (int iClient = 1; iClient <= iMaxClients; iClient++) + { + if (IsClientConnected (iClient) && IsClientInGame (iClient)) + break; + else + notConnected++; + } + + if(notConnected==iMaxClients) + ReloadMap(); + + if(HibernationCvarValue != 0 && GetConVarInt(HibernationCvar) == 0) + SetConVarInt(HibernationCvar, 1); +} + +public Action MapReloadCheck(Handle timer) +{ + if (isMapChange) + return; + + if(doRestartMap == true) + { + doRestartMap = false; + ReloadMap(); + } +} + +void CallLobbyVote() +{ + for (int iClient = 1; iClient <= MaxClients; iClient++) + { + if (IsClientConnected (iClient) && IsClientInGame (iClient)) + { + FakeClientCommand (iClient, "callvote returntolobby"); + } + } +} + +void PassVote() +{ + for(int iClient = 1; iClient <= MaxClients; iClient++) + { + if (IsClientConnected (iClient) && IsClientInGame (iClient)) + { + FakeClientCommand(iClient, "Vote Yes"); + } + } +} + +void ReloadMap() +{ + GetCurrentMap(CurrentMapString, sizeof(CurrentMapString)); + ServerCommand("map %s", CurrentMapString); +} + +void DisconnectFromMatchmaking() +{ + GetConVarString(PluginCvarSearchKey, PluginSearchKeyString, sizeof(PluginSearchKeyString)); + SetConVarInt(SteamGroupExclusiveCvar, 1); + SetConVarString(SearchKeyCvar, PluginSearchKeyString); + + if(HibernationCvarValue != 0) + SetConVarInt(HibernationCvar, 0); + + if(GetConVarFloat(PluginCvarTimeout)>0) + CreateTimer(GetConVarFloat(PluginCvarTimeout), MakeServerPublic); +} + +void ConnectToMatchmaking() +{ + SetConVarInt(SteamGroupExclusiveCvar, 0); + SetConVarString(SearchKeyCvar, ""); +} diff --git a/scripting/tf2_botcaptcha.sp b/scripting/tf2_botcaptcha.sp new file mode 100644 index 0000000..ff40735 --- /dev/null +++ b/scripting/tf2_botcaptcha.sp @@ -0,0 +1,110 @@ +#pragma semicolon 1 + +#define MAX_CODE_SIZE 8 +#define KICK_REASON "Did not submit a valid verification code in time." +#define VERIFICATION_MSG "Welcome! Please enter this code in chat to play: %s" +#define VERIFICATION_SUCCESS "Thank you for verifying. Have fun!" +#define VERIFICATION_FAIL "Invalid verification code. %d tries remaining." +#define VERIFICATION_TIME 120.0 + +#define DEBUG +#define PLUGIN_VERSION "0.1.0" + +#include +#include +#include +#include +//#include + + +static char captchas[MAXPLAYERS+1][MAX_CODE_SIZE+1]; +static Handle captchaKickTimer[MAXPLAYERS+1]; +static int captchaTriesRemaining[MAXPLAYERS+1]; +static TFTeam playerTeam[MAXPLAYERS+1]; +static TFClassType playerClass[MAXPLAYERS+1]; + +public Plugin myinfo = { + name = "TF2 Captcha", + author = "Jackz", + description = "", + version = PLUGIN_VERSION, + url = "" +}; + +public void OnPluginStart() { + EngineVersion g_Game = GetEngineVersion(); + if(g_Game != Engine_TF2) { + SetFailState("This plugin is for TF2 only."); + } + + HookEvent("player_changeclass", Event_PlayerChangeClass); + HookEvent("player_team", Event_PlayerSwitchTeam); + HookEvent("player_disconnect", Event_PlayerDisconnect); +} + +public Action Event_PlayerSwitchTeam(Event event, const char[] name, bool dontBroadcast) { + int userid = event.GetInt("userid"); + int client = GetClientOfUserId(userid); + if(client > 0 && captchaKickTimer[client] != INVALID_HANDLE) { + RequestFrame(Frame_SwitchTeam, client); + } +} + +public void Frame_SwitchTeam(int userid) { + int client = GetClientOfUserId(userid); + if(client > 0) + TF2_ChangeClientTeam(client, TFTeam_Spectator); +} + +public Action Event_PlayerChangeClass(Event event, const char[] name, bool dontBroadcast) { + int userid = event.GetInt("userid"); + int client = GetClientOfUserId(userid); + + if(client > 0 && captchas[client][0] == '\0' && !IsFakeClient(client)) { + playerTeam[client] = TF2_GetClientTeam(client); + playerClass[client] = TF2_GetPlayerClass(client); + TF2_ChangeClientTeam(client, TFTeam_Spectator); + for(int i = 0; i < MAX_CODE_SIZE; i++) { + captchas[client][i] = GetRandomInt(0, 9)+ '0'; + } + captchas[client][MAX_CODE_SIZE] = '\0'; + captchaTriesRemaining[client] = 3; + PrintToChat(client, VERIFICATION_MSG, captchas[client]); + captchaKickTimer[client] = CreateTimer(VERIFICATION_TIME, Timer_Kick, userid); + } +} + +public Action Timer_Kick(Handle handle, int userid) { + int client = GetClientOfUserId(userid); + if(client > 0) + KickClient(client, KICK_REASON); +} + +public Action OnClientSayCommand(int client, const char[] command, const char[] sArgs) { + if(captchaKickTimer[client] != INVALID_HANDLE) { + if(StrEqual(sArgs, captchas[client])) { + CloseHandle(captchaKickTimer[client]); + captchaKickTimer[client] = INVALID_HANDLE; + PrintToChat(client, VERIFICATION_SUCCESS); + TF2_ChangeClientTeam(client, playerTeam[client]); + //TF2_SetPlayerClass(client, playerClass[client]); + }else{ + if(--captchaTriesRemaining[client] == 0) { + TriggerTimer(captchaKickTimer[client]); + captchaKickTimer[client] = INVALID_HANDLE; + }else{ + PrintToChat(client, VERIFICATION_FAIL, captchaTriesRemaining[client]); + } + } + return Plugin_Handled; + } + return Plugin_Continue; +} + +public void OnClientDisconnect(int client) { +} + +public Action Event_PlayerDisconnect(Event event, const char[] name, bool dontBroadcast) { + int client = GetClientOfUserId(event.GetInt("userid")); + captchas[client][0] = '\0'; +} \ No newline at end of file