From 41a3c4b06f93a923585efaf42769c5ce0a10ac10 Mon Sep 17 00:00:00 2001 From: Jackz Date: Tue, 19 Nov 2024 20:10:48 -0600 Subject: [PATCH 1/2] More reconnect logic --- plugins/adminpanel.smx | Bin 26906 -> 27631 bytes scripting/adminpanel.sp | 156 ++++++++++++++++++++++++++++------------ 2 files changed, 112 insertions(+), 44 deletions(-) diff --git a/plugins/adminpanel.smx b/plugins/adminpanel.smx index f2ff07bcc6643030f7e4a35278245dd14b20aea6..5d201558d2e247f34f1cfdce06ebd1447cb7d8bf 100644 GIT binary patch literal 27631 zcmb5VWmKD8(>9E>&=v|cibGq96n6?iON$gQ?ocFXpjdEip+$?kmEx`ef)pq&!96$x z3jqQ_f_%BI=f2nTy?@@d-Xyc;*t2KmJhC&h*V;J~IXQJr0(^XwJs#e4AwJ&o7x;L1 zuL$t|ef*>8YVq)ha3jfjJiHgqczC2ZY{HC>r$C5@M}flyZ1{L=I6np)9%0AFbHK&3 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 I;yK3u0emS7#Q*>R literal 26906 zcmb68cT|%>*YFF22&gn0(m_Q)rT5-MKsre8LMYM_T7VD;A_6K^dNEWf(tBtDMX7<% zLJt8cp%bZ*5;)xV^FHgG?_2Bqak8$x_HSnPp0y`4bFDqsXlNK3Un3`Hbt5CY11BeY z@Q|F0?C~|S|Nj1~E6K>Hu1b%q$;eWGWMs5g+{8gnCPG0*#(2f}D~E?y_MBHt#Z6B3 z_R62{ih)na$WxX_TCZ1Bq0 z_KHET$;lM1w8xc{U$MZIhFrD6i|4#|v>EP%0e>b|gIeY$ZcmM6d-xmz{U)%q? z!v6o*2{}2s3c0v>{wKcwpr;$~f6)!-0{WlI|Bdm#7OtKkM+eXUH3tFy!$Gs#NQMwh zV5ss%%ad>UdXKz}vzwlM^Kv)VR=YudEmG=9I2GH&NW&L8beg+KHZ53Ng3xU%jK%2K z=Yi+X%_Q)hm}j^X)GUvey{ zlfX?)P*}LU?7)TD5r|s{uv}#)OUfyzz=d}Ht$Zqh6H_(h4KPOvL)qO;${oBYmdXYj z(AvD?=Oe$g6foGm^DSnsCT32S2@xX%lyLIn_wgzB_9^%A@$mNX@bj5lUwRPeGxuky zX|CHVH)c+i3BfG{?6tw_w>HzYHN*XU*uXygeSU6%Oo&@d2v#Np6%!(W31P>C*bxG@ z*<$INo9SAb;r>2sK0a;hOJ*s#^Oe}{%AW4Z?ryKb7;9{|S9HuACli7~2&g6mv> z*<#Uc&6boi^V+u9G8^oJmgdHm=A+hTud6_omzoy3cM@afuAZArh;bp{RX9vG*b1$g z`2id3b6c$Y|9CVvH?}o<`TNlPkKe{pQ*XCdXUyCqCdAdVECejE!D`rGg<6^!nOYm# zVyxjY)-f@2SJ8irnWJYyAccU@HrV*9&;xwr2}@=naj37$OJ>VUliN#^f0iCx4aomL z;RK9y?_|WxJ!3-D3jqs-fZggs9#;i9Cd30K1f3Aj=YP7g#p*lzKvlN{z3dE5!-Ib< zqV^?+&AuP;M0HFrTJAT@-!p_;E{T%Xwi?`s4`6KKA1p!NQlBxnd)cO7pmi&iDhFS8 ztYpU>nvH&oGcq_Fqd8M?wzR@!sD5D z{442|(>;E(jm=lH{X$OXg&wnwU9=0pssn$odQy)Q?(g*YN_Y>iQ1xFvDwVa#o_G2i zEJxpl7VDOt$m3|5plIa)g}07tH~pEY>C{JLiW>;8AM;~E9ZiTgT@_CRT5kjrw`v|gGSus&(?VgIb*=`{+mtw$Y-f(E}IIsttBeCe7|vwowBsDNAN6l z{#YLdZ8Tf;tP8u$NXL&}0x@nGtKuZPF)-=&*@)hEKqkC1i*}=@+Od^Q+s`1d*Ho8y zC^I$>WgPcH$`bt;x7MpKF{3td@DlT3@$YEVe);IxjQK7NZA5cgZ8<%8>N=4M{mG?HFB4)PJ7 z4YvR8|Jyhhpg{C!gEo-n4o?flom;o-3=#S-ssM7#sKquP( zX!sN2lj2&_{+t*BB(&8(xrDMd5F2g-X?aa?BX}T%bN*1>iHkvz?qDQNHa=vxg$EI0 z)>;wh>c_AtWg8awZSnvr%bQxV_UDIS3sJqQaGJ9_@LR9n%JXi&^D7Ddx)<9BWJenY zx(bU|4|_m2GjUOKJlo-OMRCImLLRfNzWJBqEVI5()iQk}0U=|!#6b|Di^29)*T1gAUh3l?cFW4fw(6%#hmnD#Fnfch z&iCx3)V1~M$C_cOvZv((qYH!Vq=}XFY9YRBxTLZ^;qFwt~xya`_g3f91!=PB`X5+G-b? zw{|X}o5$v+px%WXo3QEQ7QCo6GM)KI=>WHv3JFaMFkQQ&(UvNYHrPH~BF1wJPXJN& zt1^zefmMMs_K)pNWQRf%E|Y3|!)8kpaQi08bMJKgJAlI@C2F&|JGn<&<*f46z%|!E z=JUomyS^%x{^o(YuL&~>MC9yX>$BXXEb24b$EqdbuOZyvU3o!8m^hj=#rI3@;OjGx zHq6lqfAHjheNd?yfb4PomZMfRe(>^rNe(`TcRAao0kyjOXy!380HKn9?yhJ=EJz*}vL$a|iw=JKQ_9WvrKMccjiC6IT{7*A|RukzNL6IvAp+oB_z7rX}sN z{~8oKJoBSH$d0=3j(6yA+I{4D)33$Pv>UEvnRG``N36hED@s~xy1>c5YHLuuNA3Xg zb>;Mr?gN&jUw&fgh_1v@=1~Xu7OyxOu_gJArG#bjFs!=j-f?A`MKI@1-6+XBtjzk= zmRHM%OsY#g-52>+M1H>aYUucw1ATlCQyUJM!=hQ3uD^c+Kh%e8~WVs90 zC7bIsZ)CK#W#gdhOEB?YK(+3w&)0K|lOSKS(fDQ*q$RpiVzQ!m5KEF%Mp!Jz@Q
!S+EwuFhE^Qm?bzieAEd^@-0Y^)Evn~vfyE|>_??jDe4oR}HkP_&!LAriD-AMdYd zhTltE{`rY|oOtaZwjn_|qjl;{@y<%8D~nq#iRviJsm(4qE6A z_)f>rnOOlH7hXmjye>qE8uxmoO(-EGiLZqM>7)+OhvI(~8COX{H8gTV!*sMi?RLQCtYio$@f)JYlmEa1a(sYyWC30I7h!supJA z*#L)GZ(0>KKbjC6m!>yv%!V@{z|TqEhRt?`OQ_fjkZ?_JR&I;N^mw9Nfao4;FZ3Bl2d1QT#2C3>w*TP?*$7*x9j@#qpU$iTfGCQmg2$o z;BaMWIhm0Zp}BOyOLw}%1E&scv6U@HKVPiauQE~e4UeAW%8;h>)cUX87f!NavS>M! z6mWFh!ZjEO6)41W>iFS(6rB@_Wamk85g-}t*A86M@QI7e61^J|d1*BMwY7&+Cth-# z(>PN3;PlBHEW&b)6KVb?-6OtM`mbYJ{S80+x1ni4n};EZpKxsF8+%R#M0M2bUkeo* z)0x%KxIG{+>SQ!6v#dWUH;w&Z{Or~7d4|8$>{p1Qh-U@$b1tppHitrc|9`!Kylz$b z@KtsY2jhyN`5yb0`&)<{l5^s)bv`##5$;+~%)x1Y7qOmqck+3n|)`tjV}eGab$t9rRb%8GWzgu$&Z0-?or2lvoE!&=qpa}0Gy-}esVjAf7GCK&-!9H{n(y(iu> zz5db_gGyXt$jDaVGJ>8N?+%y$;b^_=ASAOxeb^+vV0W*(Q7QVglz^^OD&y3-EDp)# zEM#pJ4>R7C(wL|msDp`}PImaj8=b`}c_#x1?>7kGT}ah{{_xa>ZyaLB)AIY(Zp!td zRlue}Xxp);-n)F6e|B1HehK=1H43)DTOfQ_<$AN+%;nI+x(I9ESJK99jkc<7rmfh~ zpP^G69<(QYKq6FT&>z#1aVOx6@x#0yr2~VV>NLRo_VFR(2gN{22Vq-{>9t0VBV|h4 z2C}doKbpni@Dei`t~Tm_G;ey{|6HQXX*l8(cma#yy;$Oo(1y=pQfRWm7hQEoXyiNiDZ{r_cVB*zkqI339K9dv))abv z+So%<7$0AqPuX@bz=xh6SvpB^`To5l|;yG{2&po~UyK1~SXd*K(F8;{7V>#pw)^3^9gRl!=)r%64pWDGK7guaV zY8;$_*D{@J_zrS9=U6@(KbTEfW!7nGw^-X7Y{kf$^*?7l*bNu(|DuOpiBAb=uKArQ z-I%bzy{zq_`CKn!BWEb7N;6t|m|;7}6H&27t=IzZCv5e>cym9YhfWpd|G+fLk9FjG zgw+hO*)2*!n)o+sr=ly69tU=Wg3F0I?;PG z%VKL-AZG0->S9s=5LB-wC6tcbwMEVlgL{%7A*v`B=j1zzm~6J(K%ZaJM@pXmWXG~0 zinY4qEWPgz*u=)OlPTmf*_@X_ z4SSwOL(sb#$v;(q5|+DQuCwM6+m6xZIk7}FuGtKw4oEEc=es)#cOotVG;YDolSZ*LB?^O-vG5GWP!k}D0peaS5Z z2h_bOr$n8((%$2-62D}fxwnUx?E-){mdifj`Q^?j9>J)_BUf6IMj@v-ykyPevfBzY z{?aI2G@fOT?o!N>7e5}yJ3T2V`&;~Aqt*>2P`GrK6F{KZ{JM~=4FYbZlPurX?QCG* z`gRHY8NQqG9E6j+`A0)Pmgh@t+pb|d+Fo8`}ERt<)li3*_* z(yS~MNAqBi*nD*A2Kz51Wwv#F+XbinY%iR=7!`8vV15q>7)n=b@l}Kl4|gfUL*-cT zUqt`43ELGB(znlLARq)x8YA8TbKO4%ib1zHAlAxwX#qwzC=Fn*Wck_J1#T~0oK4X6 z)C?a2!o!r!Y&LUx1P-SiF{2iBWq3vMHj2zu9bxB0VMWQnZBkK+d|%xP7!nULJ)1CR zj;?R#%h6wu7hi2#@4!V$t?wQqyH66F)1CPTYH<}q=5`?U>}nu#f^vQDo9 z!zRjwve@)}N2)CE<8n_DI(T)!Eq~u!mu9P1mD)uX9W{O+=XWpxr`C_^&0#W#s&2Q( zzsB3FLK4))PzN2qRe9Kd7>2<lp2Xy4@ z&@r`f3VCS}L204>c0i9bb#n-ZcZdi6 zrgHzFaB#zLN&4JA82v?jvGiY`>lduyk)e^173GOXeaPUc6m?V)HON4!;AatA(mz}IBW{9_3g15E?^Ue?}pOr(0 zr`Lc(gnm8XI!40n%y?XUA$q#ia(}A&AWKGm?yFE(F%H7)-x*^BUj?BBKuUAkq01vD z@EX}@0<-RA{IhY}rnx8aMC{c`ENej~(;4BMJ=iKW-fv<)v+{yUYAwJZ5t7iAvzB}^ zz43y(4VMjD({F0y5)UOLd9`EraM&pf`kd3ZAGCS^SYX<KMG|R<Z*f79sA6A$oI%(_@x|@-7qL|fB z75boE`RGgsAw8}Od6%5+2j$o959v@Qu`8uZMD>2@=_k5&^34gx9W1{p#8dQ3z%n1j zdG2^ybw)Fac3nEM|Dj$;pN%hkwm{jQIUY#9rkvQS5AFb^aDspefCHM1h2qsy;OhaX z!A~qMv2Y%tziXegGk5a<-dej)2%ulo4Qs6B1Wsq}cJx>Uq~!C~*xdyu7;U@~iTT?my zaJy&_l@gBUV5Z%-eR-y~hit<^2PzMyBjZAcyiYR*Wwp92D7ajK|2><{d z@q2=&Z%%`f1kuOr%UIISLrB4sUrH)XkP$s};7Y{q!qW_~_O?Lh&NiRkDib@Riggk! zfcX!71J8-mrfY`pQYavdh_@lk?9sDIi~_g4Acu0QJ6@qrwFn0dvdOx&NBM(d-Q8RR z9n{HNvk_vNx`o_oHklm+)C1+6+0(*l99P4-VdV*GRjG@Ab?2dyj_Yz zSYO4xqe@@<)4;#QTxT75TJcg(Cl{VnV0^NV*4q~Zj88r*rJv|NOy#SBsdTc@T@q?2I$ zJ%5OQ53#d9m;YV#4pqx?-sc)X!UN;Jq-WZToCc`_VMFb-VZY(9TQ;+A6eLg=^=2jV zxKm$L;fbJ`5EPYpOpa2@I)jB2*VTI_$WJ1G5>h##e`{yQo@p+cmEfgw@Uljz9F+Vx zp3}(50Jw%v?lqEb+1<0Jhs$sMuw$SL^9*qvlvl=gNXaNi$qyIcS2C(j=23r{_x3A* z6$mOJM6N`L0y4Mxh+-_O$f~aYQeOZEYTS&g_moodLy)=5IrFrec2vGUyJ&!#HwaM<{du z)Y&87ph4ZUXD%FPcBnxem)YvMi*76q&jJw)Ess+lR z6&Y5a_HOZ(I8XZV&a~Aop&O)wtK$#4X6%jDJm2ELpfuOL4V^lWXu zx3qs2jgw{`4m!F-oDQYg;bg}6TW)QvCU7I`%CTHxqpyoYoU+$m<7l62mmv4PISfpi zS^>u0oT)NzWxJTiFGFX`Wut68wxP2-zKydF)1eSJu_(TTo-jPJ)|*t=JiFW}*qe>Y za`$Zlp^8fe{2AD_Q>mE;yp?jB)$oSy3i@Hsd~e44$FpmLQ4fwO^`g@Rw?d!F2KdbT z9UCSQn^1^*F@;|ilJhgFnR<7Z;j+r_l@X-&NJ*LpXnZo&X9h&) zr9k~ynBJe#V8KEiK>gm()3Ahp%cyf)P#C6@m;U1@u<*TqXRpgM+X>7vJ5CSwE?bLJIlTrKUsHFX$O=)=$AVk@&*f5d-w zcJ~tMjUVVJFf-RE}- zq;X-(xV!d9AbzrZ=`HfU=3&`WtLo1MN3ZYiEC@wO@qNx8dQA(DM++Z)+U6UQJJV>+ z_#H8+zCY+wF|oj5kX9`>qpdG*+HNBM%%uztMBbNw7ElJiuRNiTcG_s7^xeI46cp;JtbVkxwHOt*f|O(pjg#pz2{_Y}tDzuwud%M1u$(UWhhD2Cg*jH89x z++3$rTj7{UuiTdYj654_@y?RU5gLkq}b1}6La+f0K>E;fri zX8Et>f0iPc0gWt2RbE08ek|nuVcKi@@GE;K2>KndJWmrwP21_3r%VIp+w4XdLIMw0Ls61i#@u<)X}+E~NWbQKSu@FQv$El@Mu_I+Xeu zGF7Ki!ur8wUURQ1en=j(-aid^InSw5=Q9BdcNx(J>9!m}sIAU%Z`zqoD{+Pjlbk@B zV8k;-GYc)=H5p=r$H4?Nr(UWI+Zi6tW+=C|&kQMzEljO32z}~B+LlGVom!34K=4#7 zQd1bFD^D0Guy1YsqUpSRg z@w+#u0C1(S^gwG@O!=hy)7-L}o{L>zagIBX;qas=;YhRa!jQel{=LkvN98BMBlH-J z(ubIb7|v1(L(P1BTVc?--TUWoM@v&fIzul*rBd=zxZznIy&6Y^93_~3^R7w1$%pW= zX!pojGRE-Po8a4<*D*IRl%>~1TAX=&n{Z?k^b<6V9PZK>^3q48$%fp9Yk5K{acOoJH@1- z(JIB}fK&>mr+T5Gcyc};u4l9|Q9czn3)5*9z8yBprdMe|z_*@gWWIR4`l&rK!VaUZ zfHnoyagwZmjSksfUF#f^zT`aJA7T%n8p(TPuOg|%8+fVmggKtFDdSJ%u1LqxhYx&W zZ@&qPO{r4X=Ct^E2vTzdAv6R^Y%BP&Tn2P=($zg5b1TPZ7++F+8{_Z#>{SPsIgcr7 zN`A&Yk*mu`FQ2LXx@&+eZL@lKZX%|~#J2x6U5~89U6U7I=)PtvnhX@MJ%KN-oNi0LSdC*2%d^UVZ`hU>m4{Yg#9j|9H7k|DD3vZ> z&Fp6#!E&lHis$r=Oq)+JqNR6Am$F4CRVLI<@&Z&jqU6ZI^kx6Nn4x*^4WW7QDs*bL z@5|aLm)T6jO=wK`P1sE2O{g(crEyma&93yJ$@S;-l4Mtl=e9dF25tTAYkgBe!rA%H zX@T!|^7K5j%g#c6dcs}>k%p;K(qnhU`kcTB>K=4QtA+BbQ9(hyjQTZ*M}3JaLqPtI zZ8;9hrVywtHck~gkxSc{BsmqV&GDhPOjz=1TlZQR72q2~M1u})U9-n)FQuEI*Oz|P z^5CU1Gi+icr|+KTzQx)&DSxQmDY5!{W+nfC|2TybwxyFPvgE!pmM8Ym;V?J#E2XD! zmJnD96Z>v(T0C5*1)dyn$F^yoXYB^@R5w$)=WXs)O!95DRoLyjuD1aQhsU0*pbW;xI+3`cMBd=55Zp~Pr4e5uHVmv&C832IyY6 ze13rHPWUYK)h4}xxqUS~_Y6z&(JJr=*2w40j0a36EGbAs{Iwao=~)^FH=0_#Ow8VR z==5Wz7dYX~g}c)Q#A`d<4vt0{hq)FEbsE=TT+m48YU|kUR36v+iWlLZizs};o@&_f zYS+7Tp}r6^5xkJUpX~RieAt3Ylldxpy!b1kq7W(bccwWCNnXCnU6!Q>hD`ZFs*Kq9 zBYG2A6CM*f%;VArr2$t<0BPt`x+XFZd={}6Xo-OqW?x;jj1_(%&cFZBf^^+18Qa^XcC?5DZ4I&=K>G2+2JvqGmgZ~5x zW(@n(!Z*f3gq}Ud(pfLhPsWc{9lNK__qP$jJximExEqMRwu10iAw`~O+`W4cYU|2B z+fl00#fDUi6ypM0BNBkllomVccsZBNZoI3vX&_$KQDym4 z&VGmD`80(RsDde!$&E=booLE_Jm;H~l2|EgOfJLyro28Mw zE=enS%QQe5n=h9~m3RDtPL)nA?nSC;7e^U|JDI!i)ru0qJT;k7^p4(q_y6!X4ro>b ztI(o!R|<*|yUEpGP)% zU}-$dJ%5qC?0TycKu)=v8h|YYP7D~Qa>B5yWbb>m`;B3W|><> zsb>1xO2jo(c*yh;hl&#G;nTlH(TUr?K}*vAKf(TgFOro1p>j*#|7WECZ_cMv%pc7K zXo8`R6H{nAEc-`@G$o1A8cNFlY}o9m^P_Wu%apjWZ(L_#U(#BjYPqe3 za);jZ-+A^a^m))~a(iatrg@9i4)Wr2P>}f2F1;pyJIUwCJqCZsL{Z6UI%_=4fU~6kDPM-6@XIV)c&Rd{re6B0T3j&V5 ze;+RxZb8A44T5q3@YK0}OUa4bi^ezdW>jU3->tA*8ihc(2Qz7Y)zaAw^Ng}eCi4H;dElP)aU z#UC(eHY}7yGbx>*>1x|@TEot44LT00N?fpDu1;V>jtNs-DO4k;EKx`IdD?!?@@Hts zzuZmSXP1V4G9EsozED1K{sP#X-7Z4=CSrDBmBDlGY>~gGt^Yjc4n*K@MVDT?mGZ=8 z(v$Cx6I+*_;1hs*n*9DT0YvJExqpnsje~4Ax)^*NM-Uwk)c2cemU5=2!SJkw3&R_$ zDnBA=v#m7eUf43WzW*Wuot!8Bb1{2)ZnS=85yEu&?82Y#HKA9GgY@}Tw=MDaZrR^R zl4$JBy<3+mWN=sGu!kR88z-ZrqPwg`t^N)WUgs+Gc%J+}T10robg2s!z7#+#HqxtsJ$EO#JfCEa%;P6<|XC1xeX%8ZE>I?=qKvL7GG z!}z=2<^)xzM|9Yqr6h_)Ie%N=-S|8v{OWf{1u15OjYD993tu86|2$wX$e)c==tMM` z^5?!`6Iy$CIQ7a^UHyZI^dDlKo^OaIs+dDh)=TM1~;Wb~crUkh>sm!5CERE!Q? z;#Bziou%H;!|#6s0Gy@Gd`9mx8F4|_1ty~t?O3N%eLffN+q3V}h^r%9+co^oDoH0y z+@=pP9A*t~r}(0Z^pcIK+5Xe1fm7y*^tQ3) z#`9D^+I8Z03Fe#Bnw_j=t_9WIEnTCwowsl<8x!Sdg!x4$_nbdOegd|>A{xU; zz{=xZ5q}{kZnJKL`V)t7T)KN_nKI|blwbI6+9d07k>(piFCjvA-u=<$s)Mq#2WI}z z2+>Yamu``-)@Hu6pHLH*5BR^KN=sL!Sz`d1UzEDc#4Ej@TuUmis%jD$DEA?cNqBlw zPoW&F_E~ANbHi;ceP>uoerE&WV+!r^EQBzbyW10?qr!+Fu)MG?A^8zkTl6p+kvE#L zyxK3ObIT`81k3ml1g*nAQ(xZMEcze?-$}8zUn|DL5)%zJC~8;pg@lW1Rc!cl+a7>! zcr@oYuMbzk>=Qbo_2!c*vow3_6`G!7aBLsT0#&3?^B1+epc-N0&O<1`eP?+YIZR;-0OGM0Hcwg&u@xZih+u~>8D)?6gu&a6(Sx9IWk zAr0yC?`7t+;Pkj6gQ5H^%;~kafZJZaPn+sS8KKqof|@22~9ha z^S=GhbTOPG?Fg_K#UxPP#C&wqh8i1&bl$l>iFC45>)xO2VR#p<^ifRJUWsy*+AQS8 zQ6EwEU2cmV?zS=v*-m-Ey@;FNSL&rNJu!3^ww|PZry1T!uW%`f;SgpB?XD{}P=^s! z$%j>t)SHLpX-928l5=Y-`gvZ3b+-R9+GE8tka#s4UgC-``VVZkPlPjcBvjJaR zyyKQe!AVLubK0*Ewt<_7ogeYpD^;_$?Y&`H*!eK;C}+~OX|mwZcY#OBUX~2x3{)a8 zat4Kj6Y?Nt|2@?=D7p1d%tak2YH38F(gqG>nH{8GJ4JOD zwa8DSv8n{pkHVS-It9A(22EVF@^yvl=eMqAo35DVoIjyGQ+DY~ptSJqJC~A>w2$XqBer+wk##?apdjj$j3Z)jZF?G|B&XHRQxodgSe^ZuQBM}22kGVkgi zqtBa%u~|?NtFO|og=1nSwhmU~ zPFz~KFHG5)!a07h{+^@6BJWC&VcTwz$SiK2rH3n1#o3%mePaMiW7ta>4dGWu57ny= z9bA#Y9Gg0Z_K~N&7-HT9M;S9%lFpqM6H=;~H@QyaE-)NcMPB8tn{=hss-bL~ZHAl; z1piWK{$}2!>d_12^&{C(&41E)=oh4y3pZi>CL9>wQoj6_-TKs9!T2X+IN*Yv3F}mq(bGGzZ`P7(Wl=_m~ z{5R9Kg*k-6$^pX<;1FKrL&Db=bGtiVI`yyx#;p?Kr#%JtDtcJJhvYODul-1LS}MjbZl(8Y?T| z9<%1c_9q|Lx$I{#9qx@2GoNVvSp#=IM+W=rG;Cg7?{a;73n#s|94qD2u8->~4G7S9 z55GE<2>UO}PNZ(x*gVB+Zp=)@jDd-|e0?3O<=Tnce_ z=s%bg81=t{2?%5j>NhJ3&7@K0)v&L)Hk!`>EjUNBq&fmvxmzehl2$KnJV=CD=4$IY zs^$EU>dlPYoRI_{tnGc*e6;D5T(O~6&}bHrUil@l?1|X1HlX|co0G#P)1z(Kg9n4< zW}m=96x3+jS11Qeb#D0FemG#mIq#&8?s<7hFIVbzwJ8fiY=-j1qLhghSn|MQ=Zyfs z{oyYvyS2egbL8_UZ8zL=XS5|Zpbf};uYD{|djeZvKD_P5`qISDb+{bAsc4jUpF(V^ z@by=F>-1Mf_u#7%#0_)ipN|5MPRw|Z&353bLy8Ehe|MjJa%{wD*KI5EpxAb5`=m>$ zMll##@j8)eddnZ)18@&TAuD=-iI??sVX>!U=~5XfvSzkjMfYIKeM?KIRlFhzIV%xE zCWfoda=B=4X$%;P3%2fdz_ihPewf{r--|SwkxA9-VfKFbG5ph+OaQRl!(%fN=#0{m zoOiF8epnKlW)!|@C8a4DIm6W8bRe!#?ec3w@hQqJ3PI_Yd_NUi(;#LM zDUvAsB~D2P^zYGoEA_)NkBS4}v2|2aYk(!>hslwK!t!Nl`9<8f zs?4b134Oocg$oqU>_@8Y^*r4ljTEqiIY-~XPfoGj5ukMbmbK_?7aDi`KC@a8@;0rX z9=CPR@@|U%TACkG_+95gSqpPfaF_?XAs0A1r`h zIb5356I-*gQnss&G@~}8{>m|YpuD?JCHl$H^S(J`MLMQY5y}1cn&RP1a>4iN9OGY6 zwv0)#g@PlE5U=09%&S4ku&uk2LY!HUrA!y{goDkUQ#0;h0V9T++zNs!lohuc3lAiq zXCehndyCRTT_p{+q}rfn1GYE9FCS_&@>d?Y-?%S`7>yu5@~xhNIr+!5-!M^hl{$+$ z9BS;L^>nUzzb5;&o|b8*Mh6i-)$(_M)ox?qd3|lFds&XLbxE-#r-bCu{tjbqs{5@{ zO8>r2Qye}0T*3{&jXxIFimvorkzLc@`BuNt>mT4Jc&JH|ca)d>m=WuA7W{8O-D2#T zJs&ics0TF%D*Us5>--FDDh}4?;EP`s-J9u~VhBz9b;IC*sr3GKD%{Gtr^27DQMjM% zh&{eQCwGHLRr!G`;&WJ>ecZK-7{K0J!OOv@%ND;853WBCfz?v!IyYYnHoqz+KtA0G zc*dXyFe|&MgfG<2YJW6gf7rJv;y6mLpFb4yjEfvUWLEij7|qA!ihjd0?!@r1od2m5 z3{q~V-sQ+AZDSl@zmfj{V7VDz0frEJ&c8!#ow=s%YXH>qjS2O_!xcOkN|@Cmt)*j0^rH^a+Io&PK2zG;4>XH*ryc7@ zzaa{c%IqI(Z9*FR;&|EmRpcKKf`x`%xD4D+_FdT`ky$4;LCIM@YeUsO0Rt;Bi@;;8 zdrPHE&+R#_2e@^@`0XG6zBOU);applW3F7SWRyl0^x^kkN9U$geIv!(2p{7$*06Tv z0t8+l+UPFS2BdS6+HZAtPJp1{6Hzp2H8%N~{v|9+UZcyroWxWPvL58xZjz>Hk&vFk ztXJ+|D9n!73^zspd3+Sfm|(Tj=iL!?9#~?v3+AVhyjJ_M`~~XY3xutT8JZP@2)mi_ za!)wtgMpjYfZw{_bz}DHT4i_MQ&`B{LeG^PFWxC!JU4{T$je6)6hcNn;Nz6*6AP_TYH69GuUV%O6)f7br6eD$F(yZYi+3 zt7GwA>e~EV*5Z8eU0P1t&^wKzPsBgn)t~TFxWQl0d(++dcq%yr?AT;5`)@hn6wzNX zexJ7YJlNxt+XwEs*jKeFDU%kQuc^0C0Mw61>!V7w8{MRZ-vxf3lG?SKH*(+>F%{n^ zfGL?1#l7A$-V;;G4hcomK?Og19zW9IJjAEmGSJr6B+^oWh8@X`O_*BT(wHG zUwN~gCgVQpes{}nbZ^`=JbF}OH!@eK=j*8_CCA|Obt_&H<{Y=g{qifrA#b@k^0K-3 z#7KRfm65!#O?&E|e7_XcZTh%`vxyu^ftORybu%jNq(wK6PGPnPv+Osi{pUul^pc~H zK!KE}T1iXhPXpa5P;5VE?|4lYqSNkXPO8Ce_32eeSZMrp68p8o_MEqCi3Yv=oTgLo z37TSiT*B80_T9}jw5sPMD^CGhvC^`(13d$;cMWu`v?N|#KyGqnFx~)Do`qgme$6d& zSPakycQSx4;-B+-WuVx5^Hlcd$-N-hwHD4aN{hAM!Ak7wYa~N`aG_^@NlKS&f!Af zAF?{{Ts`%?jKTunkj?7pp{`M!k{xbb1ig#?qWJT#nX|KElFXoWlFYl5qsY~Rt?i9* zt$$4n{AY!#{3lioR#IJ>7Cyif28Ndt0}&)UFnNt8EH}PM@Kvy3I5WH`4X|AL{oCyz zuz;f_Wn^SzeaZb`)=CWnyKf`QpYA_+$$Id{L%lSUBm1>Q2G_IeOP!_`Dz*)^WDaj* z5*zvei3&YGJ84H=dGuJwu$0v_*VOPTo9U|eYTbpG)QlL%O3)lA&UP(-={(_N4E$Ex zHy)(-sKBj#()j&XMyWE|pvQgdV*Fg6Sq3Te|Kz@yz5l%aGpAji$w?J|g92sTl=Ndt zCk{)~y@$dg;<+NWyM#fomO{u>+L`YlcH z9)B!j+KMDz5;yYUbx&T)oj9Xpa|y^>ZnBd1ekT3Z5q;ppjozzkcP4(WB z=jPq^>(2}+xo|0sP%_8=cj=)>p z)9Xe~8gpVRMTy<~Cak91joa0 zD{X&O81OuO)pc#8XF|@mqfEWXLR={PGVHO%_?34CtPCp5_i-d22wA5IusY;XWUne2%HKe`LJmpj0u z_q=~fwWU^m4SOw`GKK6WlZB+76+#L_few$1-_pMiL-Gt8Mx|g{ht_lBy5FownUJZd zxHlD`OABGgS-kXRVwV;IkIQ+P%Cs*ncpumDvXudduRkUe(k{VBwuRSZWsG$!2(uH_ zaR$-~U#J*+=2XkT$11R;hI7)eTV8~wTmQH(l%3`4zp2oc&S<#ivuMebGuC0qoR64T zt)A^J2P>YLGrzJVX06UjB^E|kTt$}0nag{Ui+K&o#4dl0Z#2IQv&=8Tj&;A|)-G)& z+H+Wz;k>1W8YiC@M!#q2a%TR|(&gUg>Np$e7GrQvbHlkSFk3s+0ZJ-@scx*pp1ILd zEaTs3b)18=w$aB=3lq9k+<|e8dw#N;#yXP+-5O=K|G2}-B28+4OH+*Ty$QV0WyC8# zk+0)ir9sR-8(F;1%fw{X*F5aiav-(su7x3;Efxyb;r_O>+Q@mT`zOqrPM#=%G;K?|A=|Y0JY* zL?^pDxi`yNQOt*yzybG$1M{)vXzq4bRUAf|WO5MTy@+Buwbb5|vS-MH09ZJgRh6b< z;EaKsB&2VKcWIOV-u-cnol)~sLz)6C){Y?W>FUbF^qqQO@0q6?e|2*HLIe|Ak=tqG zIYn5)NDtbanae6I@3gBV?z!}>p(AP>uUt7%9_B6Wcw054_RQ~Dnqpk?^qM-c$?LV- z%(o6BX3_c)$0d$Mw-ga!<*C#7Mg^t5t4(X6jpjHg!f+;#vd|u*Hv5bPpom^ZD*`5H7!U)*Y4~m1a7jWGW28mC3NdV|0Wb~8fuEm zm?*;@9z^JQ?pq-^3Zi~Ubk|o$>f!c_4P!l}=WgrFxFI;o%L0{Q-e=tsx{Vc@; z51A%Un+@rFX#(eGcQrT~%F>kM{5E#=h)vRFvHlDBQqj#n!^P3Fxl)i8?%?us{u*X< zL0)FAjz=Zh+f5oAUw)=bMYoC$b1lx9tvl4pY|=2Tp&jhw)SC)wdtOY_{^+cf38Gr<}Sq~DSvgbobFt)?Kn!{Go_y*^3eNq0eRSR#%(LUSQW1uq(WVXf|@P z`@7XGHu4oVavCRATTQFDB{s3)Y9P0`2M zVp~RbbBNg4Wf_0j?-xYYQbQ)aU+6zedzqnr2KkAdciq6GkMi8EfAX2pN$HaxWBdB| zP0IW7vc7_UxsTn4gtGnbbvH`9Zm%$Z{P}vbq7~!XRkFMDqHC zhF4J1rc&Bcfy@+I4gFZ^dILjQ-^8 zPMu6nWisXAza58+ZHxSnAA--^h9_x%5Q)@3a3Vi3=}kgj_%CePt-zQVgh_%@-H7z5 zmG9_r3t~GUjgNmBDHT8_fOK2f?VouEa@QQF1yN*EH~^%FU+_@VgH4Z_c0AT=AYK;x zIf#wow|fovUa8zLiE>bC3jX?;-TE|VNhNS9gWZY%or6*3Cba=&$HCRX7d~{91Db;b zOYAce+vccZWqy!6VJ#*q0K+f9x9JLD2+*nW1_K336cF=rY0#cwvFp))ibfOmhWInEFugO#neJ3-mi6kM#I84RcK=K)mGK`Kd%F-$;UW@r z?Mhhx_UMj@kURippeS=2V0ONL48?xjho6pRu(KV08{hYdbvb}&Qo|VY;2N+Yc%jq| zqYMOZ`peJ?&~>?)UitGHH=`d5NGdWmblK209zO{-gCyeDoeVr zbOWav_>-=KqeUo;i^j~!D95QnNB*R?t6jj z5{g7BL5Jy@Afm)02HUTxea~0i8cqN~jH9*8MxU#TEJ-|&ttM7OcrqMl1$c=X#q4TD z8^%P)1XtjBGHltV29EE5Eo+d(kG{Z&W;h;xBnDhbNBErDRetMiPDTG{fgnA0wr`ex z8v6M8Kcvt5e_ik2jqUK>$;M17+&gl5@P6CFstlWao99U5#=YNl^w80OI%j;>*L`|~ zYd8+|FfzB_@G(^I02)8#3@o^Jy2?tz4FB92v#VppIT=oFax5Km&2!r!EI8%>)ZC!jMX+h~e?8v z{7#m^2OcQ8ENTM2q%C{fmrPN$Ve|n`)naHkAFzxH;!O&}r zoPwyKsc6R|(W9k%zg$n!FC+a=%$~we6PD1hRgn}Fkhoa^h(Zs**zTYPT?&B=SfoUT zMjyCf@JKf#-D$x(SU$)Zd>XwZNy;sNZ)d2i4YfZw`Hso0%x;2`ZBs)B>|JjySr9J} z8EVot%Gy^-W&~Y0YM^TQi}=a9PTXYBe_)x5qVxsbf2%EPnAEbjSY%v}!2zIc==?3M zI!ns*Bf!#SK(pASNtNU`Bwv%Xc$Ezluw>XO$PNxzvtLCl#v9^8)8^+>!V@0T7nnwb zwO7W4fOjC<^z&cQpey-UVrS`%WIo)z(&|XXoiu;EvK>1Bzf~=$3i*(abYUgK3%-Wo z8)ZZT*_JwODCDurhy1Pdw(P$2au2ld>~$D?qCi)#h+rs0^gb4HO#urm{0eiBT#7o3 zQks_^n+hyK9N@cpo;>aSelS2mK6;vTrlS0SnhM1hJ*J~xUJrSSzKaQail#)dwB&3c zT;Rvey~@hVCFEbn?xGc7%7w{XfVDshzq8!-4>RrN|5DoL*Aj5YF;r75a$rk)9#lsL zt4FG_FW>Pj`@uihBDW-|?U)Jp;@Ns`=G`C8&P;#+Bc+A6-)FMX#sa77O~hqHr@(|UUVGey)Rcd8ca+z4gu3&lyv ztmbjy=Dh$A!X*lX?Ay~IksX_d423e~M_W7zj&e0_giRe32qBKNl#d+M2jssYNeW9p zS~w^#Wu!>WQ-r;4305#Rexo#EvEJZnA&f0Z1SOBQ`36~Rzs$$5@S{VUQk4Sh4*1N+ zP}KMcPqJyhy6r56o_Gf9_IQO7Lt78%ejJPI4p5QLdNOB_OrVi|lWHyIl&YW1aXT|z zG@^vr{ikY&`9xHSpuB9>9_nvQ-RXx2^9k%0JJVU?hK?N^fi+AaUp_ng+dave%(3jJaxy~?)NIn4T--f#4ax%N2> zO>!IruVc=|TsBXQ7ClONy-94qdoOOnyDAGx`K=Pt9YdiwR9opcZ%)Fyw?>rmYed_dtYA6J7c$(z55Rri}pR|W@XUhf%T+2C11Ox zoVM^&xDIZ~+G29-jes@{B0)=&L*q9abF0r!GgTALGpw zF~l1J$Uuq7&?|Iz&~&#|*8YA6g*$-5k5XO{;fo<3$ssuT50s?IQR3;`_-^<7q16`=QD zyw2T{eK_jbIDoKL4is8vp~wtE(ZdqCjlPq)pF0va7Otsd1z?2uy}$gcHZ-#sRXW+X z?09iE&r!Tyh$4Q>NRr$~65&RwfYV$m2$Oemtf-EMX|${CimRc}2J{yCL-q3a}Q@i^66W3Q#aBpK2*{BL3aqrGu`@oaX2@vO_Dggq?! zABai|n)81^fHEQ(DiX}r#6_7bwIV94 z>n(8*L#GhHPMssLQ(K6~8n!`Cq3iygj=Xp2sfJ_hB$>X0z3!bxpG{kNGz#5Gin=k$ z+|?Y=NeVxnWG)JITzW>UP6nN^uf5#sUgOa`Pj&js)xB`ft1?`d(m|w=tXk)(KMSQ| zi)N2wNsr=H3emchHfA#hlnu3%^h8CFPg5HGlRmlAj0vksDkX(h;0`s|(Uz3fM`lb& zn>rmz>ndya$ku4fqZrZ?xGDomm8GMQN~T|2`%}p2_%DmbEaD{i|C3(acu26Kv=MK_ zRp0n$y0{_NK`Xs_)jdg@DV$-1L1!ZiL(P|A&jC^kOG}kjxeNr z`dC=038kA^P(FkaWxL8HbHIpI<5EjpE7V%#lAxs}S~@t6MGAiln~*~Pk|b(O#G`7! zYDI^8%x5j&7Tn4{vuNvreB=q7+O1j$(i#eZU#p{H)J5gCcxB+%>I?BE1C!8P#X|p9 znGLl-^+Qu)$&hGG_7BIyhjY=)}Vy}~)?K&L*3K#uaA zs|)zpeKeq(uALyLh8iTZHGgdd5IZ*19`1`0jKrVcehHE&H6bdO#^VY;pg_G-W`#M* zIhuk8kmG!IBJaKl5j4n%&e?*ZQ`wZA%nQ{*NRd#!+jnt6Oo=|ZuiWfKEMi`I>k z%1|PFcUfte@1OgF8+Ka6#350V)7(-KoO}-pSd9Ipy(A{UPJNR0J zmdtTHUr!xY?R~AdxGf_(=EP}fIAK%15JVU_O7188^3>bsk_TgB77IBlBMkQW9IiHL zNgO9}B>(kzP!uFeYPKyJ>BlS`dgyI0b}QE{*z#nb^j;(GWIDeIR(A}zyDu85?|w!T zzbzRLt=~PX)+~)QjK0PqAqXV2XnxZ!asD zLe2^f=}uuA9F$yPRE@E1# z+cKn`>3IjbMEn^LM6agX2E`Pu`=u-Qb^@X`qTrEQQ9q8uRAqqKSDuIsMo(W}lPLp4 z>pL7)IwY%tK$Hbx8(fKuDk-^WSHhureE6?|4)l6e7uaMV2#_H$d9m_j* z=?>FS^bJx&uPY7FB?6aSzCFr|=SPGgYoNAYsUQzxs4YmEcb$z%^n*Z#~dwn{vRw3$}rN!1+uK z@1)oNVI$g4u#1!EA`)tAxE}EVij8tLrU+_mkqR>!$ zF9V4zvj*3jAU5=p0r|93=X1XFgnmWcAIKDzy1Gq|Njy1<5x?}9?)PGNMK6a70+tZM$O|HeZ@&xTsKKpe14aN1+2qRZ za2}ri1bhTeZ$^IxHp1AL3%UpM@K)iN_q9;lZn7hhH3=SeC2%cXuh74`Hwu`|M-fGa zcH;Hewq*jZlMh{!5;dw%YWf%ML3SPz@BtnKq)e`Uv$yYYP5;s!!~@jqBTP3xLY`z# z)R;GNQCT`<=+!S2g8JkkiN33F+rdZnMBy(7;I%pgo}8EZlb>CHttDX(<~T$G;%((z zpn=Fh#u1;;!B7ql{2h&o6O~bMGP~m!DkN7?n8Z=e>~?&+`8>Cj1Q^MHy*^F$b=C1>lv;-eDr`UJEF$`7ydP@{cUWI$^AG}7Gq zf3~Hr}DV6KVaNv?(Me&yY#gd2CBo@Gx^X zFu9?dfz;JdHTBOYle-E-A$^T zY*$3Hq{l+X=qr!;1KZ%$uK{~uy;0SY9y3|^mHfS^I+ogp{lVS861_Cq3%v&N_n_vY zE1_XI1y1#*lvbHJH?~M zo`l&>o*&5y&!V_TebXGt$@R?tX&_ra`)Nn7fkl2KCD&WPX+m=(>2Ql!^!r*d%XYBI zFlNDZz)pTP)}w<;zdhUL7naj*jH+CCIAA9?``n{7t6r@{e(DVVGeo03YA&PR4ijl; zXZyv0YTmq#^_*E2kZHz*?;D3R7k2LQ+Xy z-uIbx{>}{Dx-#uPo1t{6gM#`=4LDkUn%_n!LeY<9yd$sENt&kDP(23@4xMo`Yu8*JNY+i=`H__*2In6M|Rq z{+)~*tvzD&jE1W0p?!3O+{dPldb`4F=9@Kshw~4^19T9M3cCY+{Nn}{cH#tFaiO+C zl=a)iFPYv0%>v_Ed9*Woq4CuMuK}A&#9n!hd|u*2Aa}uy$zYNO2Fr!f+(d7Z)Uj6 z%1_Py{AH0$^Ep~J5&AR!tzr3*&>zo{hUJ&y#wnM*)-BkRF1bo6n-JEIK0s#c=r?It z#o`ymXwY)cIpI2)HlV3zFL2}i#j~&Ei{5$|`I`8o*ce4H-Mb(YU>;EN_OH5Yc&OJe zo$M^NL;L3$+R8CxX&#lKnH=o2%ueOo+8NSe6sEcSBG>HhaM|vg=jhL`Wv`@!jn`i> zzWQZ|bHUPL_fnJOplQByxVogP-8*L$3n_2myIX39|DJQQFOq!VYwa?|^q(7+mt>5A zo`&T_dGFOk(77CO13Q_HGq5#cBNZlB@b!p1ts;X9*8TZJ&~Q zD(TJNq_f`W9T)!~D6B$%~l8&ujGd!CoCY4s|a-5FPm@FUSlU z$c<%4zDctt_i&=KavT}0-uT2f-L;zm+%@a0l6tG(es@1G6M-0nq<6k zV(z&B3$0kJ5R1CiDv?gVQ9tF5?R>YTP^ZQI-$l za|&vPM}rY)Yghi6!@N)G_qm{PJt0~bgWgY|-zs?Jdw#7J(&EzGe(O50YQEPx&M<5& z*SJ*r?`ysay`qBYY(~&~;>Zp3<)aIVHDNtl211?SqOzH~PyQu0a#V5bxgEItUj7lbF}8KK1m@qNybPS2n`EmZzO+v zde2ZX&B;uyS8_H(>t2tDfo^IRs1k%nbW z53mcK&Bs9jW5J&;3K>TyQR4XTYNetw8*U4L?hMA7F>w}b)9ysc@+e;AedY-SrqapQ z#{Y{g`>8t1QpBSrp(Y9b6Cv`EE9YV0tdgV}492D&BPH|ofBiz$#T$PCZ?dTw>kUG| zh6Ri!%BHhQ9BU)bmy-%p@0Wiv8m!m(e|APt%1qD%KG%yuKw=7-xl*&xbo+wd;C`CK z>)5jVG{5|ea0G?@#!~4@xX1rDRF;w0^V`JLupmpApYg`8+qN%)W^$e}EvA|3;FUQ_ zbP0-frHpcUIsc5(L5K~h{^N3=72!6|4>28g2K83M#iP(4B*+cI^MCr$-D5)?e)*Q? zHU67dC1Gc;zf8MSa*4&p?VP&u=@7#kPGb%$ZiW@pH~NXuVtjIrdiTw3QU6q& zaUzy|*ET;pKiiH$pI@(qfiuI?bzC>PG|ojQHZJje+m7afCV9B*l}172NGP`J(a!O! zZy&e+Mx)ODYKEhCt(+{^%+y{e=L9j7{p3_0Y*|ZeW6D$B z;FoLtwdFAsRBw2Fns?zG?>C;Bx>wI{$VGb5%YxiUoXehI|Oi&l!eW+ipRy+SvBE#Wj${35fu6ao! zS7F%%Bct*UlXRqW`6!=<+>5FWw(A!-c{miJo<(4~@R<~z3dr-DDF%|S_-b~a;~&DR zJX4K_ch(@`J#yf3hWDWw6){HzUC{M_H>oe4DMk}iu{;O5R}I+y&<(0S`LQn)_DcN2 zeJILlP<;KO&n7IvYa0`#Gep;R)eVR);_Q zzk^m?j-v9X%hxSXX!8uhLdmZy&xe5X@jiJk?CxE#xAeB%e$i+Ox2R~Gv%c`haz1LL zUAHNA{_gc(c9(~ktrcG|u6SW$5saS&yo2I48M^Q8;yvD_iRipB*4PzR9RI~cj;=b6 zMJXtYDH?zNTYo;S*4xmlUN;DC;dnl_vex1~molBV^{%4dd$p^I<2N&7+Wz|*6cj=S z^ZmiE-YvwtzF#kSx@xAdWG&1&CuDNcUsT*kwep>40Y9q)INt!fdCU3G)eg$c)R@kL z45`76JwnwSx6{oO=e`S}b2_ra<_PJF89L(Ubz_`%YFkRHOv(2w)pazdtQ8-pOmOK9 z71xT71+Q_Ha)<)GclBid*sJZ$@*{H8pzBz}vt;2RyZ66A zS|NU_{aNN#rO!dJNJ^ MAX_ATTEMPT_TIMEOUT) nextAttempt = MAX_ATTEMPT_TIMEOUT; + PrintToServer("[AdminPanel] Disconnected, retrying in %.0f seconds", nextAttempt); + g_socket.SetArg(attempt + 1); + CreateTimer(nextAttempt, Timer_Reconnect); } } -void SendFullSync() { +bool SendFullSync() { if(StartPayload(true)) { AddGameRecord(); int stage = L4D2_GetCurrentFinaleStage(); @@ -190,21 +219,21 @@ void SendFullSync() { // Resend all players SendPlayers(); + return true; } + return false; } void OnSocketReceive(Socket socket, const char[] receiveData, int dataSize, int arg) { receiveBuffer.FromArray(receiveData, dataSize); LiveRecordResponse response = view_as(receiveBuffer.ReadByte()); - if(cvar_debug.BoolValue) { - PrintToServer("[AdminPanel] Received response=%d size=%d bytes", response, dataSize); - } - if(authState == Auth_Pending) { + Debug("Received response=%d size=%d bytes", response, dataSize); + if(authState == Auth_PendingResponse) { if(response == Live_OK) { authState = Auth_Success; - pendingTries = 0; + pendingAuthTries = 0; PrintToServer("[AdminPanel] Authenticated with server successfully."); - SendFullSync(); + CreateTimer(1.0, Timer_FullSync); } else if(response == Live_Error) { authState = Auth_Fail; g_socket.Disconnect(); @@ -430,19 +459,25 @@ int FindPlayer(const char[] arg) { return result; } -void OnSocketConnect(Socket socket, int any) { - if(cvar_debug.BoolValue) - PrintToServer("[AdminPanel] Connected to %s:%d", serverIp, serverPort); +void SendAuthPayload() { + // Already sending one, ignore. + if(authState == Auth_PendingResponse) return; g_socket.SetArg(0); - - PrintToServer("[AdminPanel] Authenticating with server"); + authState = Auth_PendingResponse; StartPayloadEx(); AddAuthRecord(); SendPayload(); + PrintToServer("[AdminPanel] Authenticating with server"); +} + +// This does not trigger if the server is hibernating. +void OnSocketConnect(Socket socket, int any) { + Debug("Connected to %s:%d. Authenticating...", serverIp, serverPort); + SendAuthPayload(); } void OnSocketDisconnect(Socket socket, int attempt) { - authState = Auth_Pending; + authState = Auth_Inactive; g_socket.SetArg(attempt + 1); float nextAttempt = Exponential(float(attempt) / 2.0) + 2.0; if(nextAttempt > MAX_ATTEMPT_TIMEOUT) nextAttempt = MAX_ATTEMPT_TIMEOUT; @@ -471,6 +506,7 @@ public void L4D_OnServerHibernationUpdate(bool hibernating) { } if(hibernating) { + authState = Auth_Inactive; g_socket.Disconnect(); } else { ConnectSocket(); @@ -504,15 +540,32 @@ Action Timer_Reconnect(Handle h, int type) { return Plugin_Continue; } -void ConnectSocket() { +bool ConnectSocket(bool force = false, int authTry = 0) { if(g_socket == null) LogError("Socket is invalid"); - if(g_socket.Connected) + if(g_socket.Connected) { + Debug("Already connected, disconnecting..."); g_socket.Disconnect(); - if(authToken[0] == '\0') return; + authState = Auth_Inactive; + } + if(authToken[0] == '\0') LogError("ConnectSocket() called with no auth token"); // Do not try to reconnect on auth failure, until token has changed - if(authState == Auth_Fail) return; + if(!force && authState == Auth_Fail) return false; authState = Auth_Pending; g_socket.Connect(OnSocketConnect, OnSocketReceive, OnSocketDisconnect, serverIp, serverPort); + CreateTimer(10.0, Timer_ConnectTimeout, authTry); + return true; +} + +Action Timer_ConnectTimeout(Handle h, int attempt) { + if(g_socket.Connected && authState == Auth_Pending) { + if(attempt == 3) { + Debug("Timed out"); + g_socket.Disconnect(); + } + Debug("timed out waiting for connection callback, trying again (try=%d)", attempt); + ConnectSocket(false, attempt + 1); + } + return Plugin_Handled; } #define DATE_FORMAT "%F at %I:%M %p" @@ -520,13 +573,25 @@ Action Command_PanelDebug(int client, int args) { char arg[32]; GetCmdArg(1, arg, sizeof(arg)); if(StrEqual(arg, "connect")) { - if(authToken[0] == '\0') + if(authToken[0] == '\0') { ReplyToCommand(client, "No auth token."); - else - ConnectSocket(); + } else { + if(ConnectSocket(true)) { + ReplyToCommand(client, "Connecting..."); + } else { + ReplyToCommand(client, "Cannot connect"); + } + } + } else if(StrEqual(arg, "auth")) { + if(!g_socket.Connected) { + ReplyToCommand(client, "Not connected."); + } else { + SendAuthPayload(); + ReplyToCommand(client, "Sent auth payload"); + } } else if(StrEqual(arg, "info")) { - ReplyToCommand(client, "Connected: %b\tAuthenticated: %d\tState: %d", g_socket.Connected, authState, g_gameState); - int timeFromLastPayload = GetTime() - g_lastPayloadSent; + ReplyToCommand(client, "Connected: %b\tAuth State: %s\tGameState: %d", g_socket.Connected, AUTH_STATE_LABEL[view_as(authState)+1], g_gameState); + int timeFromLastPayload = g_lastPayloadSent > 0 ? GetTime() - g_lastPayloadSent : -1; ReplyToCommand(client, "Last Payload: %ds", timeFromLastPayload); ReplyToCommand(client, "#Viewers: %d\t#Players: %d", numberOfViewers, numberOfPlayers); ReplyToCommand(client, "Target Host: %s:%d", serverIp, serverPort); @@ -625,7 +690,7 @@ void Event_PlayerDeath(Event event, const char[] name, bool dontBroadcast) { } public void Event_PlayerToBot(Handle event, char[] name, bool dontBroadcast) { int player = GetClientOfUserId(GetEventInt(event, "player")); - int bot = GetClientOfUserId(GetEventInt(event, "bot")); + // int bot = GetClientOfUserId(GetEventInt(event, "bot")); if(player > 0 && !IsFakeClient(player) && StartPayload()) { AddSurvivorRecord(player); SendPayload(); @@ -1024,14 +1089,15 @@ char pendingRecords[64]; bool CanSendPayload(bool ignorePause = false) { if(!g_socket.Connected) return false; - if(authState != Auth_Success) { - if(authState == Auth_Pending && pendingTries > 0) { - pendingTries--; - PrintToServer("[AdminPanel] Auth state is pending. Too early?"); - ConnectSocket(); - } - return false; - } + // if(authState != Auth_Success) { + // if(authState == Auth_Pending && pendingTries > 0) { + // pendingTries--; + // PrintToServer("[AdminPanel] Auth state is pending. Too early?"); + // ConnectSocket(); + // } + // return false; + // } + if(authState != Auth_Success) return false; if(cvar_flags.IntValue & view_as(Setting_DisableWithNoViewers) && !ignorePause && (numberOfViewers == 0 || numberOfPlayers == 0)) return false; return true; } @@ -1202,6 +1268,7 @@ void AddAuthRecord() { StartRecord(Live_Auth); sendBuffer.WriteByte(LIVESTATUS_VERSION); sendBuffer.WriteString(authToken); + sendBuffer.WriteInt(cvar_hostPort.IntValue); EndRecord(); } @@ -1212,11 +1279,12 @@ void AddMetaRecord(bool state) { } void SendPayload() { - if(sendBuffer.offset == 0) return; - int len = sendBuffer.Finish(); - if(cvar_debug.BoolValue) { - PrintToServer("[AdminPanel] Sending %d bytes of data (records = %s)", len, pendingRecords); + if(sendBuffer.offset == 0) { + Debug("sendBuffer empty, ignoring SendPayload()"); + return; } + int len = sendBuffer.Finish(); + Debug("Sending %d bytes of data (records = %s)", len, pendingRecords); g_lastPayloadSent = GetTime(); g_socket.Send(sendBuffer.buffer, len); } From fb863fcd5e0d6aea0e98a35491cb07ed8c5554af Mon Sep 17 00:00:00 2001 From: Jackz Date: Tue, 19 Nov 2024 20:10:54 -0600 Subject: [PATCH 2/2] Fix swapped author, desc fields --- scripting/L4D2Tools.sp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripting/L4D2Tools.sp b/scripting/L4D2Tools.sp index bc33025..8754fa4 100644 --- a/scripting/L4D2Tools.sp +++ b/scripting/L4D2Tools.sp @@ -59,8 +59,8 @@ static float OUT_OF_BOUNDS[3] = {0.0, -1000.0, 0.0}; public Plugin myinfo = { name = "L4D2 Misc Tools", - author = "Includes: Notice on laser use, Timer for gauntlet runs", - description = "jackzmc", + description = "Includes useful tools, like laser pickup detection and model changing.", + author = "jackzmc", version = PLUGIN_VERSION, url = "https://github.com/Jackzmc/sourcemod-plugins" };