From 4b7b71e2714725bdda3b1394482fca5ff1aa712a Mon Sep 17 00:00:00 2001 From: MysterD Date: Tue, 18 Apr 2023 23:50:11 -0700 Subject: [PATCH] Change ordered packet information to u16, prevent clearing ordered packets during join --- lib/coopnet/linux/libcoopnet.a | Bin 3807246 -> 3808086 bytes src/pc/network/network.c | 2 +- src/pc/network/packets/packet.h | 9 ++++++--- src/pc/network/packets/packet_join.c | 2 ++ src/pc/network/packets/packet_mod_list.c | 1 + src/pc/network/packets/packet_ordered.c | 20 +++++++++++++++++--- src/pc/network/packets/packet_read_write.c | 17 +++++++++-------- 7 files changed, 36 insertions(+), 15 deletions(-) diff --git a/lib/coopnet/linux/libcoopnet.a b/lib/coopnet/linux/libcoopnet.a index b206a82c275e5762e7efa8654bc0eb608a40cf6d..a0412556937018721ca9b25ddb85a0ca48ecd67d 100644 GIT binary patch delta 31386 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 lsJY-;%{W}`aK+WHfouFmdjHM=wn{Vxw&$9(_* delta 36122 zcmeI5dsLLw_y1=eAQ49eFNos>$Pr0#9LF2pF)fLv#4@v+nOWJ*aI~^A!8-~nrnoUp zQOYRI5Y557p_!Rcp_NftnORv`Dw*2-_ug~P(`-lQ_xpX<`mXi)=QC?P&N;9B-us-h z&pFR!2Jq14#Sw+0 z9u6Ch`ZyZkXow>kM+}ZeI2z+TgNSUfu>!GUR97j?Jr9RpLaz*V#6)uI zETg@H9sP&7RSVpchQ74ud*{sT>M!~`iCTA6Q?RMezCs@Ly>l|d)2Gi&r_LFUglxZV&U^okMNJ;3tf3FdFyn|B%~Fy5 zZ-M^%6OuPGh^Dc2UZHxMsgfql*)5{8PHd?jQ^hzt*Nv;d@V+EE_ zDowf8;Y{_{G>auL>PfKq*L0p`&dd~4(9~F3bvV9pRB!(R zYB=LFD~-R#(c=HIY#OcojU5YBdowvE?YiI5QBJS%eM4Hfz;U@^&8Q&BRgZQ)<)}{& z&2==TtUDY{|EH#U^!N3Sc-ofSIMSCi#Ie9KMWUj(e=ew9~ZVCP%F?{}jD2+;PSzI!WV4IEK;5n;kjE?w`4`*ZMnUjd0vV z^KNkz8{t3sI^F8HKEl}aoiF=NM|_yE=$Nl~w8Iu|%sk>-f3G7vEHe9Zf9jHHv|#hLQHE@0W)hL#@V7HQb#J^nRztms52sSA?%)2Idc@9YUfJzwSCOdDlGiu zyNL1by^e0ar=D=Q!;BgG1Fk-}_O=@5_xXBHaU@!ekKXc)%yw+HT3gW_*^aUF^i;

(L;|WB=${c`_Q9TB=T7pFJI?Xj)wKFx_X*nSS*XfB9_}M+ruKx z*RxcIb^5xVWm-hUS({~TM8rXxWk*E9cAMq1x)B!3)~JZ;`j%r+5$oz(&P8>m`j!gY z7ORieIo=8PjoRRNau8+Z8Ej)PjbCx%J4Ckh(Wqmp{*me`uLRL-n%Ukch=p| zlEuqu;hrQ{gMCxRaGQy#7O*mUe@{}+`;SOgDl27EMzWe;Yt)-%IAUJk^tiu6mAc8H zjZU}XHl7X0hnn*HEfK?;DRYr;{F_Nnw>0j)mDVS@os`nfoj`rsxugI0{z;(v*G4DM z^7aV2oWocBPyX?{t>X?oSk)v!{nL`GDOb2%I5Tiif8_tYe;%pqS%>--_pD1Je@H@j zZs=0%@D*shkINnHbAFdp+QK;A-&bR_8(pu}*sz!p5zP-p6j=>dqlgBNM${b<7KNpH zBBE|&U)pt|N%Jt{@<#MrgLWxlT_S7g^9Jo&S@+NWqd_|y$-X}tToL^%ZTlg1vu{Uu z`{NPKqU%^JxFTCDS2c*9Welu;S^D&_uzxP|ZI5dIW}1E4Fg36Hu<-d6ft_MlMp-j% zCD*LTCcd(3+yCAL3*5IZyZuP3adlm?O>IBlIA52RPi?=$J~~dh?N@J>eeEokMsQDQ zP7|lKzuGu&r)|^Pk2J=`Q_Jb_^R%IL)4_|A=*;x?PNV7ya?HSc>l7L`1Ki$;mZNU3 z?yLgl`Fn1$JdvW}-rk*#%|M*89yD=g`=5=G{bFr5#9bdKc(mYBpDei4rwK0g9>qKOb0Zzbgm8EylCnPU7CU;HuuH#Z1(yx25nSqb z2rl(+>vj$cyYxFFxb(Bsy>!Cj1ef|Yb^YTpQtMJ${qC{$r-kknk??tSDf-uLvBvYz z^ZTZ{RE&4~dqV%5(0^K&s#$kh#Wh?}OU`zSb#IOebgx9n-_$&K$-NupUvlolA^d(0 z@-tW7S>Cqww(K92tTXs!tt5ouWR%B*#`&N!}YmhsLenA z?Ax?Gc>MPXF30zn;BpyF6I|-&3oi9L6mRU`ccmin2W;fxg)*eR8W?v>CTgVSW}YcJ6K+yayaqt3cKvbVa?5cm=ktP^~3#32)~F1m!7ct z4b+6S3$o*$%Kz%zKuuV0Z4aKX!Gg>24HsOFZ?xc2KTdF|U#@s#TsYN5VYu$tOAW|X z4=0ZIgriK$nXM|l&jHRI(AP-1(#3s1xNSxsEVm4K9+5RHM106SKYFR_IwO$V4 zxJ`3&z~O?Qw;@|18yz29B_NVrM{=&Qa@C2Dm>dQ z#{H-e$*j!Q+#H;llm*c$DJw$wl?C~kNvTkN#y8PafbDBP9i*F~lk-QkN=`(~rIQmQ zxEySP;Bv4jf=hjG!KHq%;sgE5xI&yC9uy8TQBP|goT!;GDp89=_^k=@GZVF5`Pugc z*|+Hg9gI;4IxOPK3)6AI<$%u#E(aXeD3EBWZzQwxF7@}QcHEPMUHZ)vT>2I1{;d^u>Gy`<((ir2rT&=UQh!qS&xj4= zN%}PtT>4!e>(Ad!-Gp8GT_?EoyG3xRA20YC`m$e#X7uFe-E5;52rl(63NGVs6kO`x z5nSpIsd0?{Uf89dwOJr9(yzYYQr}i^sdqI~>usR0OTXI$mwxvNF7?@hOZ{Bk&U3;p z{azDX`t1^2>OT=&>W}Gm&I!BpYp6fq3Ep=t1ef|Qg3EUL#i?iM8{_=X(iuC1u3TJ7 zM>G%2Q;FdBX&!vye5AQLaXuBoZ*Gv^)%wKvjPkSZ2(o*$eP45R;yftg$`j`og3Iy$ zAh;a=S;3{=um{E~^-UF5_Zr)fh(1bZNz@M9Psw`=F7HhS+9^7`du;a55cV;Gb3F3{ zu&fY#jpn={PT19_E(2NwGPF~4@QxOga}KxDkA|=> z)b^J`*xyukvR~D~)<6dSO*_W4ymZ4ITdIby3SqxX+1**fE|>B&&4ZWn+?Hx7FAd?h zHptIh${Uqm_D906zev>C5InL~V0=<<55ZGH@WF})o+2mfJv6kH+Cz5=N4bX{6kIN) zCk2;FX_nwpUnscLFIPPKq6eCj!eN)lRGrp=jK~IJL-4jCc-ISfc3@Ktyuc9PH-zBX zAvg&xM_eNKzXQm|$JtwjK{|XO_`eR&{}_UY={xt}-QOYv?*i_>V+nS+mflG3(8hmn zVB8k3cDhdlksI=Zc(vhv3}LU6pzQGpf$5X}y|w+u5cWru-91IvOT@A$&^&m<7A2?+ z`(g;cEkS6Z;F%%#ogsMsr8sZS=Y>J0s7!F#p?!i&{Sm>X{(J}?-Ns^Z@|c4+XEF?z z;$7OPOLJ-)|AuwX5V{gfp?UAHL~{c{`{*=!VlU4;4>;7BX}osigvd|UW;>`d zqI<0Ig@caZUMAxY(SZEMD5`B>U~gg2W}-U_zF+XUZT<1GUlev3Z?oVs-g|<}f&USL zH%{wO^K2vbn;Q|%UC`?i-wMytpM4~>^Jb0yk zoupRk$q;^j2l<&R^|E$;KYM07l^8Sba=lV-ZKqc17;O)SOs>={!R2@+3oa9#E4b7z z7F_B}6jx_m`IxX#J8*|3-y4D-3&GEX;0=-kE2S!|Phbhh3xk{)r{-n`^|jy9Jz34n zl_C6w2Kkwvl-;8I>=T0Qf9jceI@v!ncg+@Y<;*M+TxNQu;4;%|1($jseSJfRHrae- z(;szN4rnP4Rq}RM1ac-r^buS(nJ&20-yyix*TH4ypMS<);oo(mpArJ;SRlA;Xu050 zzd>-R-=^B3Cx>;gQAYjlHg|aYz|cy>evH*Tc-C9DSF_$RgkS$4KXX40R(|$Jg6t07 zcz8Y0UhT)}BCeeE1%k_wt`J;~^ku=Nev9BzU#Ylyc9K_yL+#a-p<@SiCeP@gI?Vl+ zXYyMFmnY081bi-s8>g#q=Te(3e_56NYr@)q%cfpT$Qg^`%LfA`{ z-R%?h60t(x);#!BaG;Y~QAa}f)du;Qr-I+LUrSe@zw(JPNprKkO?sudTxzBD5`J=} zT`joG-%Wzc{M{wE)Mp7U^^Yrl@x@}Ui_-8Vm{F|XUw4rUTQqyG2qYUg7=nKtg4c%N z@tp$+l<|8gp6!3Ilp`1z!r?Z-r9Mk=*}%*Y{Mie*IG2@QU|k|fQ|MQfgR zon6!>=^MgtNRXeoNp4nt*-r>Rxk>Uu@aIDCS3~f>G&lQwOmDV2UH#)!A5t|{m5Y8} zC{b{^K3sy!_0&gjslQfmslP$-z_}eu%KsXz9k|zg%Wm@VB9P41^bou-1b^`YETAF;{)<1P zIwc%rpvdl*&O|~8o*IG=3~+kl^KSKx^zQ18H8)_m;KwgXb8{t|J8)%pwFB3N@OwST z&)k8#m7o1^kbMl_RpIq*cXc^BCF07<(Vv1}kf0vQpO=cvbQ8g)K0$D)Z>M-*bLcx; zOBd~6ZVr==6oF&|69ktHWD73!iv_>n#%E;@bwl!e5C2SM{3?X$1RWsN%gx}Rce&!5bul=%wpFArp3i8X>Gy7bsn%NhHpPbo^g3HA07F;IsJ;9~^ zbHSzlnBpBS`r_=2cHjibr`4#QRMrp=bIzWZPHdXy!HG@psSD2)(I>@fAAyh*{_JWGJ#tJmkHS?xJ<~0f=m6^f=hi=FMl5B(LcJyWDHXk|HZ3D zthR>*myh(51^-m&^LkO`R~XcCZRcdl2f}qB_-+yJ3lZ;I!Ak@`FXG4tI7@FesGH8< zhi4nAihoejIZ<Uy3Xp6Tqa_i;4%?U3NH0?1ef|PieLN_eg{H0d@i_b;8($A1D3w( zX|{1+f8P9wlYSipmwr72m--=sOZ}~?9eb9r%k7uj*T4OYMY=z0giglaA-IgcUvQ~E zD!A1Dq}#FdyY#r@1ebme!DTyr1ef~3{nSO%(@$MAON35dG`9#|A~wQ1nwtyPT<{kFcZYIb)lfgKbuQ>THn%hG-zaQjm&e+ET z)QtTTWH&FGb+1%2*7(XmvgC}#3od8CDY%@0UV=;gHG)h1XvNj{-g1vVekG0i6Q2Me>|Zly%^x6IEYuIq;T(%Yi2g zF7-VGm-_n@zxX1V9l{|`aM?hK;Ie`B1Jy-xm#|B}PXw2K-v}=Ce+e%2k@(vO_@vR^ zdQc#da=UdOq%M*Jly3Aep_B0+5?scgB)HTU2rl)@bUW*XUHa`6T>2dpTe_o~%^(p$pkH*JDT$!j-g3E#bBe)!Rz4XA! zkb1k|Qh$@;7q6K6v_o(r9!Xb;m?8p}h%HwTtuE z6kHDME5YT!eiB^j{}f#6hg{?D2Yqu6KZW^_s`yujysddkaQQ9zGQs87`|k)YJMp#P zvJ)p2zxeC@IvIg!l@5(E)P<(4u*-(}3NHPw5nSr;5?tyZ((PmmyYwT$rC*8QQomJj zso$&H`9#>I-)X_6-(P}DebZ|%owtN*)rGUWu*(S@pzOxg*ZMCo_ClePPhl^^&KKa_ zA?zP(`^gaYaF5^L-PjZ8XNlNN$(jf6LYGJF!u}!rh6VYV7qHuv-{={_Pu?jm3Bfmq z;59+*%+R~}s7LMQ6T(mK=060N^A&YnAP;hWn+q=W$%0FLKgHGgUp`>md>s|=t?)?g z$cdHq$szdi>(qC;TlD)O^`3oBbl`-TxXZ2&4CH&k?SjjJToHn&hTvlrSKsN%Ksmxe zW@LfjQvaghQomDhIe?D^A1Hrv@Z<%Cz&%)Z$YEk5OohXT68yLH5IX>Fye$mhL+uu3Wkw3ogg=wcs+5Ck2=KKLnS0 zBh#O+!1p-%gE&hAW$=Fsz+ZBje5mH(@RJSPE4XaHE4b9p7W{(mah}OkGew!|WcZyB z%9CN(Q1zXBi=lxTm-ZgoJ|u+wL2aKN!oE`5eIe{0D7*Wpu$PFHbVl>wmGtLOwUX-H z5a_q`Yo)pAXRf5SH~9VP4;Fs?>Ez4~&4$Z!>VwiOy7P1hz9Oi(@JQ9I(i_ymEEj%q zVeSxI&g;8^%XRRH;8K5FaH&73_{I0s&Ks%hFWkdkePbYhGT==i_?QrULI^%B1b5yZkXD66NagsS1xoL zvER-1ei%ls@Aywx4fFr)rtCjL=&rgcFp!(YQuJufE1XXweDG_y(98CU1iwwhS*f@> zcX1G#Ka9oll5miLei8gm5$Jc#%?>rual(hI0>_qdt`_`mc~!bj8_Ym0b)cJtgA6oj zI3*m%{Xuq+pF{i23E}t7aLPQ5J#a9{FGc$u4&j${vl8%t9uW!XsJYqit~yQ+p_l!B zL~*qTCWt_f1qCv%8aW{X9Tfa=5$BVjID>SDz83n8;h1l8O|~6DIX@yJDI=899Era3 zvvk)ycq(%QpC&pmJ1CA`;+BO%FEjF);uP@<9_Wq+Ip3~(eJJ2y{sqOa!W zV8-Y;gN0spVvgeU=1=&Nwjjv)A?^HZ2=RexAFmfA0ivHAL~?yxPwI@RRdM0LmY1C7<0w7iLPhtYlr-QLvc|5K08H+BB(|I?4L&XM?2kiIjq z&g-rC+mOCNaa_P3i(K3s%IeN^xH&xek4xH}kMSRyY|;W8e|+-x7VyL$quj=IPa9u& zOJ{2<|Fud-E9V;i>y=floQDkjHOuE)LohmyPPBIJu8 zHo?3bf3St?C!0|w*RPDDBdFVRbdzIM%NDaqM{|lk2K^QIdj+g--<;A=x1UZ`!lEGk z(q5Fs_ImnT$I>ACioR6L_LuYz0qhI1f83j@*}g*i*96(m_g(T0%q#VGSLcJwg9ng{ z?OO&aL!?UJzr*niqET$Wd4RGf2ia#{Nd;{83{v*gAp078{tP><-_$&k_Rni%Yrykz zw_cy4tdxo5)9*0&`d#Zh<}wOfQDsT<*s%4jEVQakYOI0xg_~?m!;YYE7Z-j*A+fM| zQ=?JqB^6M1XluH^uaBvLVeQJ6@hc5shiIIs*c zzCvL<3PzpFmsG-|=+;3RW)Q7c^;n zAqo>w*svG{LSZNuwxV!)5elE6u#gMqQ8@4n3ih^0FcWIDx?VaW(L4;C*92l7#P z4uw@H7?sHs{Y+{z1N9g-gk6Er^nY^YwdNK!!Stuk< z#L8NQLJWwpt39Q?4awJR$px@>pke^ya{L0&o9M`Z4)C1?!<{g^X=`SrptYH(XQoij zD@Xw9OH(DI#V@(@pEUYtmY-`MxUQV3?~W$xG;nZccYVdANmBq zJQNbSun~pRlTbK-!Y(d!?t)IDU<~U*m2dNQ>q5l`5w-$`RgXjQ2@2!6a1Mn5T)>Z5 zQw$15_pX$=AAK7Ruy7>$_E=ZSVXz#a^P^B~=}Kh`J_a~25#W4RI>I2n8%BORR!M&@ zOhD8-QJ9K?k=>2b-hpH#Kq7-3-6)H}R{*EIkVbSz@43(hg@s(mMBy$jj6k))#mP)5ML=Sxp9iP9MQ?Jw zZ;Ng5iLn17?B_VrShUd^w{V@m?9tTd(}xP+L30;4ZS=!^He1*`Fb%yAn(t9aM8T-j zmrg+w*0wL^_%NIX_N9bsIN1xFwg!KR_y_w^CJbRGp&W3Jttn+dL368ZwiaFW&k1pt zt^ALE-P{l3AA{zeLSZNh#?pRtgoEq^SojH=`?eoNAHYP`)psN8T}OoI*q_p154*NM zR?}!i7~h|=7%T=DdKZANKNU0h2p|!FmR}PS`QpKa&WP-*>#B|v=r7jzMnl~MD!x?k zM4)>Vwp0ktdh<`H*97sD=E~tK!8wk;<-skD{`~OYhV9CsuHfu2RFAli;OsLlUg@tA zob`pYmYjpLJ#CbEdyx5E9nSpt(rmssN$I}{(uc7CFY{9+Q(tw3;`Q~j0dsD?i_&LX zQiOq7YyD{3O>lM?p&Ts31ZQOLgn#h5LvYsTYW-xv8C7>?wZ$^i&+%Z%kR5g!OYW^7 zYrnlaTP>Dd!jH{=8I-crd3EzLea5*$FAUSYDdjD74$c^<*KuKxc@`d+_*Ee|yV~?u z@w)`)=FWvt%V(X=>`eU)Pu(c?4)pd0ehR}YMR1O1{z?39f^)pNT0cy1*00tdy51o; z>sKp%m}N#3B_JOB^A#fL0(^LyR9CjooXKI^Dc9qH>}^$gDae! zjDNyu`3k4g+Q9eD3g;01Uq@OLJ0Fiqj6idE6~$2HgY{#5<;BiPR;$a`VYRc4HEM*m zo@qj(#-STGlsJ!DC;56m?~J!vi+#7f;2azlwM~nfw4~|@5bZ8?R$KS^7QN&=XSE*j z<*nuBPS9uToG)4|l;z})7uGba!1XP~X6)#uT=t?xo!*!*cE7NqPmMiOZ z#r-HMpPD{gxon~eP|g*%uGDg6q^`IhLuIb6c)7CK^x?`;(+8EP=tosf9G8)6lD### zABUprQsV z!?>HtHW~1YshkX$elz7Wy!>h1I>Sj&J`I?uq4#OPQYaZtF_jE!pqv7@&QwkTj2uDv z3_sOy{>BE)ts}^m4Hh{?wd2i(a4dujyK7j>un5W=z%iyW2XG&h44*NT49`P3wNpQG zHtrQkXBYNNAn#P*tNakr9f2H?-xk)w0BP=&PEDxw>`p1h4O8{PoDFRbw6mf0Lc4;s42y0f zTQ1-pD4*r!mJ7HKN`|&+dSL?6+#HTN2T_M!y)pJ=r zjn#}(rt8>@=Q3`c*C~be=XOdaZyrmhvy@rJ9I#qubD6cyXB{(dKI>+%j#d5H@5tw1WTpgI9Wfa*K z15U}+ffsYETpgGz6|k)4esIMFc_HLSb1Cb+p0V`m0Q_%4{;P|(kh7S_<1EBD(L?_Yzdb%puPbWG5=0wM(F_oI_P0Mk#_*r+(o_=2|S2b*gI<8J^&J{w~UA zL4MxFf?5`2jV4eP&)7IBkBX!7BFI<=d-R|KydsCgf`m!cAP zH+hyKL@^ZkfaMGi=2O`QmUHDOEL?Fvi;4^KXCZGnk4~*)IYZ|>a=pTGuB6{hwq;P< z4#*qRy9{uODd$STJjyEX*^Yi$)~T6Mt}P9g+T)Bp^YE!De6HupsJkhDIRYimrz(Cg zK;Y-_zIQ&AeZYaAL#)U#l+Q4Bf$C2!!(>##dZEWFP)Qv_o)u8cUqEFq!|lCgh+Q;> zsu+H|fLsRw-7BHo2jxn@eg&LOjE&)WC>c&Dpi>)JSqwN$SG-(#rhv+}vz#l@_fSgRe^L1eJ0q-dly?6py9+5-4H|DT_N<%Zlo;WP2XaQ>c1=Xa{a$ZZ9Mk zXSl)h_BeX_MAtfW;Q3BHjm#oGDeGGy_Y3fjdx$(Qzeo=%~nwb|VmvK1@Ccz5=BXy}-5$+cOZ&|96?BzXeN`_08>xJ|R;F{&+c?IzJILhbuBP;c3gpC$2+13NrDJEA9 z8uYFQjPp`H!$E-l^B==>C|?CED5kPESotbo0hA1LR*`EDXNh6X1hSO@?pcLT7Fk&a zST=$38U6v~o2+EG56TUI!&XxnL+=K_^H4Hew_2^wT83#8$yN?{2=Fi~%K^Vf#lRjc z=gNqQRK<$bCF<7My%F%W5}j18yj4P3Kf<@1E9s9?)kes>J+E4EZvw1*lsuaN?|fdl zl`|X<1-sR9rRGtxy#~dXfV_XbuK{L0M)?ezyg;sBE;xhNvU%)dWZMk$44C~_j?I8& z@L^aD=)bpMSo?y?E&ePD^6(gWd{7)+quk0F9)Fyw7&>1hTLs?ZCXt8VXS~R{Zbus{ za4txnL{$v8zNm8T-U822P;LQiQmW6Y43l)FmMf{HY8KqDqf!9*>yQ_e>azsH8U$we zdZ}9K?yZ2Qpxg?09I^NuUJghZn{Zk9Vk<5Si7)9h$~I`byhLRuIc;1?c!Kh`!SMzt zUgHEaOnriE+W{v5`k#Qd1HSl@YOkCtW1pZZR($l5TKVoBfH_Z)X9r-tmnrKr?gYak zC>h=i$dl#X3Ahi+oqWN28K;uyIscwY!g@u~#+}IC5qLphy!x`breA*+&vEDBRS9_N zWp&vtuSBROYt=QqmMd4FV&x0ME>x1AB+o9$p9MV6-C9h4xqQ1$qx= zq86IDh*ry*$XCd9jzhnRO6gPNc@t6AyrO2JoMGl zRi6m}DPt$b)B0_Urw1@!)x2->Fd464d_VAa+y=0b_B7e{BgDa1>C`FK?gz|$n(`UO zl~LAdRx+%H@*Th&z-6p_2XF-{+~0DpxTa7QD?S9Y@^!ZgtL57=eTJ!m;(VFfaOGS{ zhr9~%8#d@Wg?9l*O(D;_fE63Gl3@Xq3}edm5_%7?6w3DirS3|5ESqfAfZG85!>R`S6czulxDuU1Rjg>ZNnHZm2LO}t zuyg>>1L(gN0#el5yr~Z$#}hVD)|cG=LEyQJM;-)TxJhl=a$utpu75*Qi%NLSCd_eK zK6ab`lMwd@9Bx1ReE`4fU(+XYV51uS`2bDV*{qlJhk(sDs|LMXshmprA3~A3S+~G2 z)0BUN=0lZW41RZ!;I_|~+(G(M8bKZY_FO15NF=v(s|z;PAo9O324^a_3s)VDz8Op4)C z1D|&)$o2`|k0Uz2CvB0@KY=oR234`;hAle!r+|-b(b2h*w?#&0G73JQ!si3X_;$km z8DQxQ@_Ysu{kp!#U|0hs!|MV0`Nw@2aEz{axsvlbRj-Z5R^UqHOsYBzd9jA>&jB-M zlIL^4N>j^Xm zG!4rcRzS&cl&L%dXqio(BY-)kl41I6s$y7dD!&3OfbuKAN)4C%j@#B6C>b6xl}DjW z$R*FwPW`MFdVg(vJ1S>3HkYcHB`D_p8mtVuuffu^j@fzWn2pl9V_Ijri+9i|hFyLF%$!f2p8zWXS7HCfz7!ur8`)Chm*Hga69N{^C)>}ES$0xZBb*_; zKLaN3zH78d-7hkbuUcP(rqw9w0y^a9GS<^BOS=2IcVQmt_Rf=WRFd4A!pRq|)gX4lwK zqh+=JN&(rn+05+Nudt2PLa)EFkn(@! zj_u-;oS8Vblxms#EGlIS$#WL*D*f?tkr9aJu@q+k$Tln)hl(?%yG_yrF`7x#D_5_mV547E#sj+)F6({_W)-u#D9* zFIP$zQT`v?%QvX32~VycYK8kxC{E$CfC|wYO>+mO{~lH|amv ziqVDS`3H*1Jz{v}|3Frw1J!b6L}8)L)sH-$=t$b!q*p?r*M%Ov>F-ftIm*R_g;g%} z2PiO?Rv1Po5qY_CypZy(kmbCo=aONWR=5pRTuaDfKv50&@4(90a$L)5xiV=9*}@>R z?A0fYFu>%!IzwEkTtZc>NZU)*rC5Y2L*cMwYMGZSkwp37u72S;doe5i2NQMLU|Xr* z6_@1*_9F5`AYR2@a>eqQiQzspKeuOV`XR!VVB`?lF5|B6B@e$BAvC`yJxf*mzU^hQ z)xmqgIr8xP^4BS!-_sjX72cz^y~AIASu7{;-S~$M@I6crp=5!^)~6 zX#CusZK;;6_ 0) { gNetworkStartupTimer--; } @@ -691,4 +690,5 @@ void network_shutdown(bool sendLeaving, bool exiting, bool popup, bool reconnect #ifdef DISCORD_SDK discord_activity_update(); #endif + packet_ordered_clear_all(); } diff --git a/src/pc/network/packets/packet.h b/src/pc/network/packets/packet.h index 85bec426..859ac620 100644 --- a/src/pc/network/packets/packet.h +++ b/src/pc/network/packets/packet.h @@ -102,8 +102,8 @@ struct Packet { u16 seqId; bool sent; u8 orderedFromGlobalId; - u8 orderedGroupId; - u8 orderedSeqId; + u16 orderedGroupId; + u16 orderedSeqId; u8 courseNum; u8 actNum; u8 levelNum; @@ -147,6 +147,8 @@ struct LSTNetworkType { size_t size; }; +extern u8 gAllowOrderedPacketClear; + // packet.c void packet_compress(struct Packet* p, u8** compBuffer, u32* compSize); bool packet_decompress(struct Packet* p, u8* compBuffer, u32 compSize); @@ -166,6 +168,7 @@ u32 packet_hash(struct Packet* packet); bool packet_check_hash(struct Packet* packet); void packet_ordered_begin(void); void packet_ordered_end(void); +void packet_ordered_clear_all(void); void packet_set_ordered_data(struct Packet* packet); // packet_reliable.c @@ -178,7 +181,7 @@ void network_update_reliable(void); // packet_ordered.c void packet_ordered_add(struct Packet* p); -void packet_ordered_clear_table(u8 globalIndex, u8 groupdId); +void packet_ordered_clear_table(u8 globalIndex, u16 groupdId); void packet_ordered_clear(u8 globalIndex); void packet_ordered_update(void); diff --git a/src/pc/network/packets/packet_join.c b/src/pc/network/packets/packet_join.c index c2065250..4cc4f321 100644 --- a/src/pc/network/packets/packet_join.c +++ b/src/pc/network/packets/packet_join.c @@ -255,4 +255,6 @@ void network_receive_join(struct Packet* p) { smlua_call_event_hooks(HOOK_JOINED_GAME); extern s16 gChangeLevel; gChangeLevel = gLevelValues.entryLevel; + + gAllowOrderedPacketClear = 1; } diff --git a/src/pc/network/packets/packet_mod_list.c b/src/pc/network/packets/packet_mod_list.c index 9c0f07b1..5a8e6f9c 100644 --- a/src/pc/network/packets/packet_mod_list.c +++ b/src/pc/network/packets/packet_mod_list.c @@ -25,6 +25,7 @@ void network_send_mod_list_request(void) { network_send_to(PACKET_DESTINATION_SERVER, &p); LOG_INFO("sending mod list request"); + gAllowOrderedPacketClear = 0; } void network_receive_mod_list_request(UNUSED struct Packet* p) { diff --git a/src/pc/network/packets/packet_ordered.c b/src/pc/network/packets/packet_ordered.c index 4542b25c..13f75a02 100644 --- a/src/pc/network/packets/packet_ordered.c +++ b/src/pc/network/packets/packet_ordered.c @@ -13,14 +13,15 @@ struct OrderedPacketList { struct OrderedPacketTable { u8 fromGlobalId; - u8 groupId; - u8 processSeqId; + u16 groupId; + u16 processSeqId; f32 lastReceived; struct OrderedPacketList* packets; struct OrderedPacketTable* next; }; static struct OrderedPacketTable* orderedPacketTable[MAX_PLAYERS] = { 0 }; +u8 gAllowOrderedPacketClear = 1; static void packet_ordered_check_for_processing(struct OrderedPacketTable* opt) { // sanity check @@ -159,7 +160,7 @@ void packet_ordered_add(struct Packet* p) { packet_ordered_add_to_table(opt, p); } -void packet_ordered_clear_table(u8 globalIndex, u8 groupId) { +void packet_ordered_clear_table(u8 globalIndex, u16 groupId) { LOG_INFO("clearing out ordered packet table for %d (%d)", globalIndex, groupId); struct OrderedPacketTable* opt = orderedPacketTable[globalIndex]; @@ -196,6 +197,11 @@ void packet_ordered_clear_table(u8 globalIndex, u8 groupId) { } void packet_ordered_clear(u8 globalIndex) { + if (!gAllowOrderedPacketClear) { + LOG_INFO("disallowed ordered packets to be cleared"); + return; + } + LOG_INFO("clearing out all ordered packet tables for %d", globalIndex); struct OrderedPacketTable* opt = orderedPacketTable[globalIndex]; @@ -219,6 +225,14 @@ void packet_ordered_clear(u8 globalIndex) { orderedPacketTable[globalIndex] = NULL; } + +void packet_ordered_clear_all(void) { + gAllowOrderedPacketClear = 1; + for (int i = 0; i < MAX_PLAYERS; i++) { + packet_ordered_clear(i); + } +} + void packet_ordered_update(void) { f32 currentClock = clock_elapsed(); // check all ordered tables for a time out diff --git a/src/pc/network/packets/packet_read_write.c b/src/pc/network/packets/packet_read_write.c index f6169f0f..613acd98 100644 --- a/src/pc/network/packets/packet_read_write.c +++ b/src/pc/network/packets/packet_read_write.c @@ -4,13 +4,13 @@ #define PACKET_FLAG_BUFFER_OFFSET 3 #define PACKET_DESTINATION_BUFFER_OFFSET 4 -#define PACKET_ORDERED_SEQ_ID_OFFSET 7 +#define PACKET_ORDERED_SEQ_ID_OFFSET 8 static u16 sNextSeqNum = 1; static bool sOrderedPackets = false; -static u8 sCurrentOrderedGroupId = 0; -static u8 sCurrentOrderedSeqId = 0; +static u16 sCurrentOrderedGroupId = 0; +static u16 sCurrentOrderedSeqId = 0; void packet_init(struct Packet* packet, enum PacketType packetType, bool reliable, enum PacketLevelMatchType levelAreaMustMatch) { memset(packet->buffer, 0, PACKET_LENGTH); @@ -54,8 +54,8 @@ void packet_init(struct Packet* packet, enum PacketType packetType, bool reliabl // write ordered packet information if (sOrderedPackets) { packet_write(packet, &packet->orderedFromGlobalId, sizeof(u8)); - packet_write(packet, &packet->orderedGroupId, sizeof(u8)); - packet_write(packet, &packet->orderedSeqId, sizeof(u8)); + packet_write(packet, &packet->orderedGroupId, sizeof(u16)); + packet_write(packet, &packet->orderedSeqId, sizeof(u16)); } // write location @@ -162,8 +162,8 @@ u8 packet_initial_read(struct Packet* packet) { // read ordered packet information if (packetIsOrdered) { packet_read(packet, &packet->orderedFromGlobalId, sizeof(u8)); - packet_read(packet, &packet->orderedGroupId, sizeof(u8)); - packet_read(packet, &packet->orderedSeqId, sizeof(u8)); + packet_read(packet, &packet->orderedGroupId, sizeof(u16)); + packet_read(packet, &packet->orderedSeqId, sizeof(u16)); } // read location @@ -231,5 +231,6 @@ void packet_set_ordered_data(struct Packet* packet) { if (packet->orderedGroupId == 0) { return; } if (packet->orderedSeqId != 0) { return; } packet->orderedSeqId = sCurrentOrderedSeqId++; - packet->buffer[PACKET_ORDERED_SEQ_ID_OFFSET] = packet->orderedSeqId; + u16* seqId = (u16*)&packet->buffer[PACKET_ORDERED_SEQ_ID_OFFSET]; + *seqId = packet->orderedSeqId; } \ No newline at end of file