From 34bbc39595605831f61c77d21c6d2f04dc556e31 Mon Sep 17 00:00:00 2001 From: Sky Johnson Date: Mon, 8 Sep 2025 19:29:30 -0500 Subject: [PATCH] fix conn handling; heartbeat and timeout --- .gitignore | 2 +- assets/heightmap.bin | Bin 40004 -> 40004 bytes assets/heightmap.png | Bin 4654 -> 4609 bytes client/main.cpp | 12 ++++++++++++ client/net/NetworkManager.cpp | 10 ++++++++++ client/net/NetworkManager.hpp | 4 +++- server/net/packets.go | 11 +++++++++++ server/net/server.go | 33 ++++++++++++++++++++++++++++++--- server/players.json | 21 +++++++++++++++------ 9 files changed, 82 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index 8840fe9..9cd8624 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ *.o - server/players.json client/game +server/server diff --git a/assets/heightmap.bin b/assets/heightmap.bin index 9647afc0de86b6cefdae6385ac04150ea9a71fd0..9416b45dd763f80ae8ba45d775a7eb8cd823fe00 100644 GIT binary patch literal 40004 zcmWh!Xp4HT)QNgD3iqNG$5 zp$K_OiX;jl?|nb^>Gu1dbN1S6+94(;W-8BdW7B<18vYPcn;*if?je%XYS6f&0dqfp zK+2e2WbYBvKeJX`-)X6szM<<6EPVF`xjmneq4X7F0(&rN$S*i}{enVe4_*{^VxL

oh$9TbO6o6lm<;k|IZYk_y!%V0cx4lrf} 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

C7| zBM)Jx!6q2TE=BN{8CZQ@2UZ_d@b~ry);J)I%^&W|%4b-xv)?l%ey6YJtQ(poHBPUW zs-^vr9`WqYtp#K5ZM%k-T=VAA*iin%^&F4ydzM=%1#_MLC;87CzFaxaj|<(7aSC3< zqoXRNPKLMc{w%#NQ97)_3{H+`x(8>n>7@ZIL#>j{c;8QCsp&y|`2@_g5->=*5x4e> zzVE=3i1>aQv%Jn@*RB-sg?Y#}cmcab7079Ok1ryZD}p z??m1}Md3krMIqy_yx>qKCs^yt35#dS34y<51s^f5JCXHA)DCt+Def1F(^8=mngx|* zj}ddT92uYL(73n>I|{!+`k)a$Cz>!}NjseS{zmG&f5`qJBOEi369&}C2}Q4Dh4rF) zqGEX`21$Nl_3NLI%D1C`NdxkJS3|eQdo-?k3$3%IsO)-#@AnAmeQx9Q;v`J=kA%IV z58StIgy&&PoY^rQo^@mKp!YyDsmP&t#$)y_IFxxhEN4@481>^NpLo<^8<94tR(K=p1u@?JlKMV(j+)T@NeuX^$AX~E{RKk>HLUrg93 zBV-+u6C|(Yg$KFvLZ!&Ev}=|Tx~-ED=3Nl$8cSpZ^D}=SS^onPt#;JTZbR|Qn@CH# zi!DzIG2+l0*o^y#?;W4;c3M56r`A9zrUo@z8{ncK#ttujVsX%K&t)O`lb`5 zRzFZI+YZ<1t&n-yj8LPm===5~Zm3t{uUa{t_A5jB`(lwLQ3$ysd1x=ZgPgHR_%ALT zN|o-oowXE;j+$W3-_fv`G!)gUy)bj|H)d{_${evuPs}YLK zEw1QmvjE$!j76l(V6ZppP(RlVkxtdjH7bhrUTMT0#$A={TRbL5n*3V|%bna>F@mof zbDc}-IN$lEkmo)v=5Fcb+)@4$@95Xc7k_Q%@NDMNf=b@wdoC{uP2owm(|GQTyS!}O z4Sv}?j8EpEDljxUOQ|Lf_}$6j%gYZJG#6{1ePQ?Zfl2<-;r=L4YbJ`qOk3z7PL z1N=01ihM^Gtnu_l^r}#N@VSJ{TdA17BnuiN?n7_!Gm&psj;!z1$TIo_AMHkD|7yjE zl%Hrk^%v1o{^7gQUnr{ng30M0$kFNU(hJ#_n%;){s}toKI6xhY?NDzEVw^} z<$WK)@q96$T`F=EpQCxyGbD=rzs8MkaKOC=Gc~`U%)1dz?;GGASqF*zM-1Nm5xYx2 z!s}HH7J7X^&43E@wSEnUkuOj(;2C1&3*h-P3l*c%p|w2;Tkpo>*{3M@X`g~-&wUtr zXg2Of>p-aOi56vL=!};`+p2f$!tc|}Zh3DuaBVNiGTFV-nm-brVjRa`dzbRoea+m~ z_8-q!AxEf}rLE`X$#tbN$qnsE>s)$M-?hEyx{f0GJ^aA+@8occ*i?Q~?LSkIzp1fc=aTSbOoo`Zwayl_+kTVQqE@@%KKQoa)xBF@0y%#lj@{3KU}%)l0v>NO_mCm^r4FRniT$I zAT9GBNVYcz(I`bN`fsB)y|vb%ky<(=>7z;8Pbtt~)%RRCw~)uHKjc5I=kxWQclo)< z6keJT$?aVZa;>n@TvHM+jZqqxv%Aj{$yPrlrupR{(_Wp+R;DXKsxuDHmn=X~{aQ4B z61fUy$B-Hrgk=3llr6sm)1yfUx_T4AGGZ-Dy#R{NMdJVeCHxfMqWiNd{QO!6kvN04 z;%1TMDfS~2zhc|42GI-k85ZwrkuLVDd~9AJ*zN`7no4nC-38Ry#E3C}oLG;H$AWlzSd)YUqGnFdJ`{<$C$VOv_=dkej4v}b!LY>=pO))mah5W+ zU4P5|w&$_ek8iSBE~nX(|Fl_hi>jpk^D$`*#_+_!QM_TqCtlXjlVVZ^)ALiqX}-1| z4Zkpk-pP+Ar9Bg=FwKCnnIQ$(Pol&|eNy;5gt|NTBCC7d$TnPw)I1bO+q{e0e5mEi zJ`tZkEsX!|zJZ5s8q4ec$nk~iu1S;kIp$Opl}YS|c`ygrXRP>o4}=bxfZZwc(S4sI zoRs!KsnrW7cLgA@CKMZDFTiwpA|B~vz}i=e+qMOm?DiCkHD17YK{=$7_b`*KL5RXf z(DiC)c~>C>Rp{SQg;Lq~P;z)JY7L%YK*Iyf!+rdaoI>W$(@32gik*|gvEj&hjNW+} zN2jM_tYr?YKi|i_+(L|=U5tpx=Xl-sDH5~_aIS{npdf|)xVw1!zxZrT7XGu(hIQOs z^l#6?nH3p$@Hz?g2QOjG*z;)83r1{$H(E1yA~|9iOOC?{sWhy~p5L^~;_FWRyhUn_R_BVz_0c+?Dk&3sp(0e$r(`V%)9! zQq+tq6B)T82i&6!+M9}Duk!%HC@Bgy-odAP$02=x0)n1DPS>7Kja|wZ$qp@2)0*k^F%RGiH|QnUV(C zJ7yN`kvWfMjg@vaZIJrR?U06jap#f0OSqniGQD0hfNt*}MxV^}XsD>c@|tEy%I~Jq z&}0eSHMStV!Iq@$yO92_UO*`)=2MKqLh3)=noe{sqwi0aP-Z-6*jjCJ)%?Nt8Q zlalz@Sr_@u(SBTi3iyOLsWi$g#_W$?e+CmjR@`!rrS5HJm;0&0Gf4w%>L`5K#ZdL$ z4z*iE|HhkR`0_0nR%2su)cY!2#){mxIq69JD)RWQ5xNb@hqh%tTqL=8m~an&7v*El z;X>@|_7tOXL@wyo`>1cr#+F_gFz86b>T$%WP4GwftbNcjoD0)%9W4CS4F?W=U~XSySo@EOEZS(I#M;qbdRy{U z+O$HQcRBUqjeq*^{7Z9q-T62k9n;8l`t_xbkt67p&3JJyCX>m^sZ{=b8X2txHHiA2 z8^+eOEoKE7{<5dHJ?+V7-Aan-W=DPt){wmJM$%Zef&9&F=(3z41^?HB@*V4VqsDXo zU~B<*dXvbrLl5$#X}!4a$gZ66Ww#|!s%x1~-vsu3YcVrC{gI6y)XoYbRZ-MU7t8$^ zcE4E)y}8?vvCa#vK}`ExCa=Ww&4y zngg{59D({dqCX)Mjmg*XW@RF5&t1j${3Cd6au9p|Im1hT4@{dq(9QD{a>s}oY1cSR z43EbXodm4%OM*^#3Jk-N@korlLo^dGtKup;o3G%DLOe1mE<@Gt3aYC_Ey+DmcYXCN zejN_Ngw-dJnQ--+THL2G%)@n2Hyp^h^eg9oxflTNZ_C26coEtgfqyb)zwV%jeKZE$*(YXHY3P!9HIiSmKh$N6ylwZ6CXLXUM*p-CZ zqp4`}PeZHab&;u;2+ePCh%k-DT(wB-RNRK_FekJsI6~fKEfnWE!#L3!ex;{ydi?*i z@nKL4ih%mdi@jpG#e}9VoJHa3i^$Z+o+^Kf44AwFrI+NYoy@b4jw0`71`XaZ1+Fs8i?Y!}nb6TDJ zsFQEZeZy_nXY-w-!g-;+2Lb`}@k#A4d#MC>_}g!wZQV61l;-&5m|IqDL+ z2Va6p^d&TjZ>v;4R@7UcN1S&Eo`(m*&twq{#GLGJ>3o=;Tm;F*H3$*C8-o?x5oqLv zpF4c8=FmxKxQAiEvJ3dD6bIj57olnqgO0W+DD{kh#+*>dp9_YY>S@duBrDUG&Y~on{*QQrwSIkrsy-QUvO6Bk(?sii#}9z)}1_Do$-Ms-GIUr-R=WE1 z{(E_c6Y%R)$;pduE4LBuHBK^kA0O^Vou}VD`qGSe$w#bN}AR zMIKmg7 zh2f90kX(p>|F}rxXojM@`2C*KK8DpdMx#Fh~^cPw|BgY;){5D`v)fQyu z?uNe0VT=#)L4>GPtrFj^z`RhAcN&fk(Ti|BDFi7?PGb3bAJ}VqB6_zg$`dz3qP+|! z|C@_}Ni%Wcp(+0T7=dq3W#Jdencns@%qada`!Z(3Z3EIAtZy8LBUY?`f`O!4( z*+rUFbBRWLji*!Imq=SUPl4vAsa(^KR*g7LeFSeR_4OpVmG0zv@gS-9+DJNw1ll!b zD6N)Jp@nsweD%X}{y6F)kN#)IJ4alQN_wx#u`^PXME)$7+^$>2X1tDNvG(`b?1g2l z+N6OUTBeNFEn-bt5czJZ8xT>x7nfIiVED2VP^kK*uR6qE~W1NHxd8EJ=WMgB2o8ZSi*5N)#xs zhK|Kr)K1(2Z+~a>-+Ki2ZM<>!qdx{K28wI#i#Hw~P}kc7O%w6V8n1%P!UfpdXo9x9 zQCPlvDBgPX!y`cfqn%!`*GI$ISz$hNecFfZ$$B9vNHddY`3{pdeeTXHtv$H%*Ib?{ zCr4w~43rsP3KiU07TqAnj&JL5+NB|&7Oe2((HW5_S-GA%ir zKp*-g)54UAzqaVFaG3S8y<00&69j!*(g4(GDYf{cPGbS_kKz4c>`9U5yYMr-eB3C_gT7r zDYL3MX)Jb zh|cfx#eJ|uiNO+)1G@_4ueRgHvqQLa+8r8E2eG<+D_Z~Bq34|iSg=iimAnx?EYO8} zXg}zlRDy|TJ2SI+%}jODnCGRv?7F86Q%sy9F<#zn#+)>5sg}kAX&E=;TTVvu)#K{8 z&h>#*_0^1m=dPleKL1gk>``({I!3Q1_|l1eC+SIUpr~aJq1a;)r0x|<*S)V&$?RmZ z`jAS8Zr`Nn*&;8XB$Fil)5$yM8ZGD%Puqt^(~OKD>fh!`%2!>f^Qar;KXoN<$vUdk zWfZ@BB&AO1PbSW)WdFC7uT#q9gSL2czt(|#{^A|d)O(d?5fv(If@D8)QoO{T%idyH zA4K+qd>Px*@ryYu>;v`5+9<6VgOGG%?D;Ye-ow{`Htxn`y@Tkx@*v6%?g8!I3B#J5 zh!5L?@8b`k-0T3hR_=jY*fv~PF8ZMD&M||DiEPKC5>}_Lg#Br{X!e)^xun@}9X=ad zjRaUa&%phDGjKu>L`IDz+W1OTlx>8q!xpFu>!BCD98rGr#66jY#|7iCV7(4Xx-=2+ zwgd-x?Fbt9)MaHjyWJ z;ffLcJ+o5uF1wJ6)QfJ%pP>3v0p!ppn8FOs&;q?M63JL1xBU{Oup}}yN~7-iHz~1D z^q5=TCF3uyc^1zewTlmZ_)q$5O&{sjyY3QWm&wen%a3XINMh=( zoQ;@X#B?TBvY3utv#Me*4bGk z_fAUTn{%n%I*+VoeykkGu_W=YzOb)yt5w%>i=D)Sc|)P8OmkdOCW)HO49Xb4+#j6=u9Rk7c{nv#km}P}n{aySq<;)d6EP zznhHeFO#v&e=1yenxWvh1MQ2q?iX_eieOUpB?fS-7z~f-?MBDcN$qNP4T{9X0=C^wWxWq zJCS0nW$}?^YJX(@ilr>KwT#s*`ong*3`At00p15g^hsI5R$>E(kY(cRnx(LvxD;i% zw$MAU0!IC8V7t)*rkaLWY&Q%~`}BuKLK17O&R_r|x!%fUb%n>-TYG(WT<)GEcj!oQ$iOh^U*$1eV@Vu;c&LV#{#2&r-v-mR zRR)yQIE#wJxK`U>7ya{hCl}olBD44uott@alJGNZZ=Y<@{8bMSe^hW_}&`u`b#37f{k&S@$vmqXO8&&D{bIncdifiAf@ zu%5mEl`dAWtC|Nl@ecBTqle4MYRI;e!H#|RS)*kE%iL1T>V|)2Pi>T7DGb1Z(&4za zWE4g!jfZEtkvNM>f`X&7kXkkurTPmndgKD=pPLOYKM86SMMgx65hgy>$DnWx=&C9r z>)LPDdbycx^Dbts2hKC|mc^_nP??=Mmm<+^=q~9!b**%L7USz0M7FJU4X@^kWVdP% zjk_rF^8@Bkz|WN=U$~7<_Hn1yXTD^!K7?MpilicyOJt*$LOv%%&aN4!Elcjve3Lv< z3o4+48ijPv{0S+pcuK{JPpR(OV@mk=NIX{sq;>2bonMhf_np(|!3>d`@jHyxX`Q6Z zP#+3W^P)j*2kF56&Gfd&n&v*5N*lrlQ8|eoLzQ>@v1%S4w>O$gZwfs2y@#~bs-NVn zL3d_7!JBoS$Yy&MmM}-N5~k@}$=-jJL07y6*7@jS(Zq>}-fWEH>C-TC^i;9WI0Y;E znDfL@~3{`hna zdY8aGQv3!86d1YJrSj^H8>JK6b2~3-g(?aIrxG&xmOV`aVhIq3NK^tf$B^ z`@tM;eq?={i&^&UL^gk&3#-{Wjy-%Q%hp{PM} zAlX&>QK89k$|`XaADc}SZ@8Fb%1kI;Pn$+-D$}0ZpLv&23IF%wCLiqL#$DIdN!vPS zXJ0Q(mzbt8=57?ujy7^ucl8BpsIO;+HuCs+u`jl?4?}p!Xt-^gfQO4GAb;f;oE$eA zBj!#NJprazG@OaK@(fh%HAK4nNGwh7i?v~@s6159W`@6KqYu4h(UtYA=PU~>Diff8ieY$;DQ>=*h!;siU^7Gs z%0}Y9%e5pzF*%Gcrmg``>B#&7Qr>u%Jyb@ZJ;GdUr1nGVb2S9{y=Q~_m9y`wUNO%hADEhJGqZR5 z%Yx1*;)1;zo;}dS(~^<+^U@HkQh?B1)#;j~R#>|Acx~CNuDfskWB^pO=1-ckX<^ z;4iCua^O$yIQx2BjPjydPgNha> z(}hu2Y2hf5Z)O`pXMB&-#zZ&zeR?M)e_chhf6S%eGGqFASBJEVdyq>-6W=WJgny5Y z<$fww{MVWjQvJgNB}dM_muy{c#41XTvy)rXShdJ|O+Q-2+8(ztli}TPHbeu4Rys&O zG8#{%S;6j@Tst1k-Dz%YoI}j^GjgjBgo>(+Y1@XBttWM?{tM=k-vQ-&t zI#aA9H&FUAm)CSjnB zK5|Nj;rVruJ#?Ur?bCYBN_TVSdj1a6Pe^69qQ9JG`>^7}^Vp6ap_0(cZ=}f`{@hk2 zhx=Dn@|01^G-k?Zk{@Y7--kF*|Brj9@PG$d$a#zXB|lP65p#y4@f75lP9sfk(e(|t z$ocp!GMt_z@)4!9Z%Q7iPJcjeVjq*IW-%R+KBv_N#dJ~O3AuC?P@p=|yeqfK@$?O9 zXi2BnrD>EfI+3ccMUeA+e{y``PWZHs0`#58bA}ZK=^2tq*Z^{vE+^(awLJH55qAto z=G~`k=bwjPm$r%C=&;y+%y#bzRyEI;?Yww}eLf_9*Xh+P>(^g4)uAW8@7Kb#rQ?u2 zU@G$ZF%+DdgPnDjc$Q*;UE_?fZmurs(zS5Qbr7UZ{ju_4Z~Ss_W%(ixd1l2OHaGAC zQ!11}?@7IJB7Y<*%|$-{`B}((Gz&v7&4$*G#R#ag!|lDIMl5X!tj^3vSmX>?otlF7 zD-&^W<`@K=7=jhEmGQT}jzwI2#BvASW%kE!u-Ted*pgvkEb`nz_G)!+_Tt*(oS>~% z+(tK^Up@1bHzs%T-*<W+rnDX?Bsjc$8?RH7 zZ7Mw*a+5r3Z&JdMYcyFtf<&q+&D`QfDcfBr$9XHswJ)SUgU67LzY3)f`o`t1yyL&s zAM-rfcpktO^YW*IrSog$So1D#=IxijHf*}hhN^JpefT*uO>SnrPOBn)&tP$V#v&!# z6hka#i+Y+x*m2wzP4`x!cD}X9BoPoTBXX;=_2Fte8gnd1iW;9`_*Y}e#xM3_iyquz zH6uiRjkh}fz1KrjtO)|LE%55weAH@KqUXrPnAyAv#{X?X&jp+D*G8OGsbmY6$qS&g zeHMO~F(lWSLiL{kCfpv1JcDkiwyS0>S_Q0K>lV8`Fo`+mM6uLUUd(&zNH)}Bs@dcX zT3q#hAWyNp$*OXta@g6}WnHNUJ-y*1VKn%5oU8V<* zuaSc!ofc-_qQO?#H2ZoEsrDl3u63W{+#XS(W)amLd`j^x1r#yzF8zI(Mo#Y%==QKH z)Nn9?dOk~`1$HUq5g11S?m@J}#DivD+Dqm-&Xkk7kpgw*(9RLV>5>>@sE_!}`yVLf z{X#Ri@jowqc|fx?r1vq2{d7-OTv5ahxqfF?hx}mXs~ecX)6XnXK^8Nn^hf7}F^Cmo z+r$U6vH9p?I8GJwzn^RHJ7_&tYdc`^!^JQ)nTg|dq9?AG32rZ)j0YtXQ7dX!b5D3O z(K5l5Ol47Rrj1MaQ$^N>1+pHAytA5xxb0_+W$vpH)3_aKUk)JWtShc&>_z#lZ3qcm zkMEuKaF1SwbSo>I9A$yF<3@-WI1I}j72$fMnz_jpGX1q#?BVHnreNpA3cmJXPs@v@ z&lul>chA|+C#am`1GN&lZ^Hw=`H?LBuGc63g|^f^=`h_{<4;%JgK6B0FuHOpf*N!# z(AS}tscBa-nb+SGxr%qF_rfe1p>mgYnh@#V$*1N%9w#S@y=41+D{UR(L=o<`G<=i^8QW@-Mwu)vyj#O} zT;RMuIfU2MAacjoUqyqAD9FWl?ljfLaA(DC3XdYc}E zk~r6>G+;BrraGWmoCy-zYc3RZjc`G82-Hm#VeQbs%;rC5YO(38JpCv$*xf40ytg4| zwL!b|h=(QD@b}_ftsz|V?=>D+^p@9o^reJH64H)!q8U9ssOj|yYOx5Q=xaf=H7|s^ znVqAQOBZSTrbJRTzfRXR(`Xglp!v)0&?#9?M~B^`u+=$KR-HkgUnEgQugfB-IGTDa ziJ(Ep&e5vKNSZzS9PR9LisY{zp~g8I$??$&YMZ!-UYDEFrkY`NLPv#G|83@q9#46J z%>`~}wSf!D^4!3#ms#KEb6Mwy9Ht@rgT*IwL*cR>qL-`}!e8`5+k|1r6}i+8v&CG` zzy|S;R)dyoLz_w0o(f3Fg#xzg>Gqy}Yz1KhWKQm+J)ccG+~^X84xp&Fn$*R!$^Sg(ajtZ!_&Vw2#_i50j3a2NkY6 zMh;@#DL!6gz8#39&gxiFl)pj`Ew9md(==LNlR=X68Kki z`gbo+e?FYMnZ`+twZ=$>*4VP*l-taxtDcQ8k;4VgJ`m!yk*+)e*HTUJBi#b=i37v+(R%>)QZ-&m`17hCqiSl{JF^>7;_mKej)CFLb#YtS?z6dWrj>7lH z(R0mlY}7i2b@yGdb^cBmT;70nL+qe-Y&H(nj)Rq$Fu z8>xPBp^|aO=t1r&GVdKhIr%ZvvQ*67hb55Js6=}GJDvu)#n9%&2%75?MrV(PP@Bpr zx-r;~bnbYIyf{ya8}35;d{8 zPNNQsGig0AEx-fEoZL|x?1^w6(ZlNQkHqo*a2D5fLZ%n28$DorNu2Yw*aK0S{bBxK zAWlW-!vBgX46ZMQ%iC>G-hUK#UmV923WRS{Fj{YhVsYQIu678Ku*ekoYV9k(R%p!6#4EzXvWQ5Zxv_ePQH_eqrFH=REF&ZI*(7XDvD zXX1|4)`oF&Qqe?%qk&TK(JbkB_q`jH$l)Yu5+&&*QPOZql0xPoL&i#msLVs&wU8l| zOiiXVkch$&y+z;p2llnEXYak%vz~q5zng|mw4}~8b~GdL9Q6$KrZ*mh(wRXw=%$cZ zda*v1E?E~%UnE_p^?wG^S?jJ*?+0vVc;YHe@b#n@-n!F;!qc>+(Vo_IFxK)(0bMp} z9_`;eky zJ061c8KGD{90dQu0PGI)N6G^~HER+g9i%6x}kO9 zX?WHhLhpVf#4KU+0euxrXdaIb6@A?OstTsXjN%+_@8wc!Mg^Y`uOGI!QmC%rNXAAK zk)~PS$(A@-_HHZCkDfDVYv@8+m$s62P2s8g7b7ayyO*jZo}fBBLh9@9Jx#MT)i88X~XmkZxF_92*jl18crTAfho0_3uKkbA|z0e;UKVb`R9jj$l~#&XFtbV3}V$BunEV5t0a5_awHzB(U>l7}j3&#pwB~X!-1p zwaLyH$6I1<(mK=xE{DbrbqI|VVUaPyEvb0Uz1K`&**=Fj{d?oNPdmf}N;BRHchvY0 zt0#{MEq_a5k~+xRo>3xWs7SSn7SOA~%W09OfR;oVQOkB~Hhn!qQE-`hX0mzwnX7cg ztt)icgK=OzJ*e@(MLKf-UuxZRin3miCRIAq#(j?TOoTO^Q?-T0EMiP1No9K8Se|a( zAx(py4wBULI&!BYp45!)COe|052 zvD|{4mI72r3Q$jtk$&(PW-sxAN?;f~wc=pWb_<~)H&Ojx3^W^~5x+M9!dG{&%{GOx z1XAF~xB_0Kw;8h}7Mh}P1Oyz-A?!jihz9_H?Wt#OU{JlRGYmX#g z?#w&TX-b3Ank-~kt`t#@Z~jk?zgT@03zfTmF5 z^2aTrDtm{hxt5ZGzlX@`NmHmud@fDIBAR(%1zpx+K+_iNr-?yM^zy(d+FfyqDurkb9CF&w2PIc%Y(Pd1g zw3Th-8B)p9TArAk4HhmxZ%{P!rBq+zVuheX&yow$N#&Nzc+V;Ik7qh`4b1Z2fXwTr zP~K+-&tx;$tUrL$%iUox!t#5o>oo4C{pfsH+J_T2d_I^4`X}vB_B1oeJq! zjO)j)bH+6n+WHT1a|?yzRFNL?`X~mjp<%4Ix`vyV z+#sg#56tfGLBW72JY@~AH(3`3XVh`bNdYo#U$_{bB5uhhckcM&B0vIq=J~#7LkwJOUQi9 z2c-Ur9eMrugz);RBtfRkB#wWk!If(6$^q(2=$le}}x$G?AI&uZlBmU@dVg8I}#(U9AfvNgE7(CBJ4Q1TW=lQr7 zP=H~NhcM?$u-mE%M-^+>Eao}mTRujNKgE2@Jm|3JEyvx*fu0md$0i{0RT!S{@Mipy z^B6dK9P&=~ki21odI?KJ2FU_w=*_E5KX zY;JzVhWg#yL3Lv`QaL?cdbMdOZPZytO(Qj_^2sT*@n;*^s+dGhEcGS1M=z1dBi3a0 zJ{fYh(?h@Xs~Wc_m zz|PAJDb{E4#OnltryNGfW>c)mUWuZ|(=ce*#ih*(Yb`cSGCQhRc@N}P1paZ>o{#TXJ1LzTl2K`$7bpw zvzfl40{VE>66$nIjn02Di}q&CraKqTqQUDY(luAQh~P;IS-bNPIlN7oG$}O+P49{$wG8bZ&OgZcyvFm8nBR#yHc@t|N> zn_fdO`tyN>T2VgY_R$u&6&CvN@5E_!Nx9 zh-+{vzJhU89=*eV&osT}W9gaqOiy}l3iZxcq~~T%qlv!CwD^=7EsxTmW>k|3 zD%7Y8>z{136ln0i@pLdwo@$?(M7cheDfsm}S@krBOc~xzd`44+Imh=GnZFv;uR2&O zD0JDyHBL?7s%j`V+3GbH<0uW!cN*~Bw+*cY`_ZCt7=x^TT%{BMnZY}7tuMeS???FE zQh~g46}Wx20wP)kv2V2y6TL!NZ6i93nozi`nf0B`h`Rj-d(9iL#r-)lgP)$;1?N>g(1n%^krVSb0x4j{}kVsHL$#oH*mhx4DF50a8zw!ne^|l(d-jE zAAE*fMJMzsKjDK#2j*A3L)`2pydGriM%`Ncu>~<%iasaLr`S@yuz#>J5{G%LUU& z-+FIi5?V~AY-%Ud#|)63++mVt_>rgze&F7#iDOonGCHa_#O>S<@3IqEr+EQ_lq+y^4u@b{8p}=-!at!BI!B(u z<;PR>4p+ncL<2U~HbeC812kegFs#%8*=y}^iEYPu^^X`HdJ8M1X1JVdLc!4%9BpXD zwyAF+@V||}N0Jd`k_G*-rFfB53nz_c?)#C}2dug_?E(vEV`J2;$bLYiMS<`oiDw`F6(%?xNUMz&*f8fwnm!5N8o z*sqDkfp_81s%1QY-;S92bRAR{&PH9M801SDxD80=1_GVA3MpwW@qDiS$-eu-Di>4o zM{g`~uqY#GH(n99{cR+5_6L%4vYiZU?jh|aBGPXnLA5+2sqJYos!{iyD8_Y=vu_$m zkXj|FVzWwp@fxBgs3(`lJtkcPX~bCFnaH)?6^8AJ5!{^cCzq~xm>Xm6#l_PM&Qj39 zO*}Xj7E@J_&t`)bJ%53%)KH9dgO!ID^L_>6g?R#^v@;+XK=H@p$7tDB4HdQ?b@jbK z#*|is@A?GqPdzxlkg+N>dl^sk3)+;vK<&^MbUJlm;pR?sPw9lW(P!Ax&xj+RVS3~q zX0Sf?lq-eVff|(TW6y10C+u99=bZ7x=D2^rrFHGN`MC$FT|>A!djvMFKatt>9S5Hc zpx1$UdJi)m1NRMn>w6G><0FE9Ho$Lw8OkOV;<;TeZ#mtPTb%ry4P4icn}USSh@!SEUimna~_AbLtRxD^CSW zf9Ya*sxfZwwLzP|EA&~Wyk$i&gjeG5U(;PkZ^^@8Z7J**JcCwbJ#^>4h9hmozaKl` zw&p9Wtp~BBXb7dHgGj6D$BT{q7>OM~y=VaIhWgRw&T7~C6$9$*d2Q@L@}*p?$zZX* z&QIX|zhqJjtFQyyx!p5=-_g8#^`}8iD9v;9Fn-S*s6X(@!#Q9zcF@B4}FGOVy zV}i>NO#6lqnK_7pH(#*Ur4@SD*}mmhfzJIU5IZkKDDymfn&)AjOBS+c-^HPiH(>Vu zDjIFa~DmvD1-oaHi?kK^ti-~{(qnF`YrXOW|hCrRbS z>m*SrjkGrxkO#UYL}x-dnTThk+u{WYd-a-ysMU~>bV{B#q?1Xdapay)C~>y%CN%#f ziR?5Yx#`PEMuZx<>e(Tjg6K7RSra+)zEj-0lfK*)<#5jTK@sP-mu00**M_vbF(f;z zvAoF%N$Kuzvhzdhv}kl6Nk!e(T$o7|WBRx!j4jcCWh+`B_Lwnm&wd6?>&31W|Dp8p z4=fKD!4jPj7<7tYKSu-|tDg{oF~xdC$c`IAbkG21CVYe5wy&seD8!$Yr8sNUfX>P7 zNbBllnI7LD5cNVX`wM*SzF2}7L_JMZ-3yekZb``pm`dLKsX zjBuH(#Tb>9xF0$P-FZ@YWKqFIBzbZDCsuM!&*}s{uD<&Ioguy#a6OW&Xst_ z_!IN}(Io6{0@*9PP2>;XB|qJ>iR!F;^7-KdVm2?H3?1_$Dko2qXP?c8X1gj02!?G{*n4{)aHvombc<`uLW^=PaklTkA2{lDoux8GY~h{ig~r2U~tO~ zzczSba6>508{C4iMJCj*QK-JGLIB&Fv72$%96NBE@s2fa_aiEL5PKN&aCq)0ijBqj zJjPC3v_+hMAuG;@{UgpRdx-N3%or0?{TJk_h8VYc5OWRxg9h`+YR{@b{X*v9&+f!J zk8kL&{s!}x?E87uikSBmp;A)|<% zHj4LWe_=z`5E5IyF;7(&ETr2}($@mVJ#|QqC}ke!Tx_0q58k!6u&f~%s%tOeVE-XZ z$=->@Ml2`khc0Hisld5^h?8#1=3*XP=2k8<h|$3#WIE20)Q+npOFn{>|B*;Kk0p`)INL689al) ze?4%G^T!gy8|<8%iYDiLSm%^O`&cc`1T^Ak(|geSUGNO)L(YyNh?V@rFKsbCAV7jo zG?e1?u1oQw!;(B-D9KyMN%0mx7~6;OOnexJ$9xWBXZ$OI?h+9!W*0-WxDv7pUt!R= z1D)BuP?i0Lw$QJzk?TW>BwP0!7-wU?1RwZDhCeKj;}?pJ&T{FiZwCk z(3ENqlU08+-3rU6%$$n)F-({25XZGipXT&e+Hv0w?BuMyW^) zF+!KXH$ui^C;zz4B_6`Hq|wNpOfK~z=QG1em0uJ&*y2x&7yV1Zb$5`E+nPl5jMSHg$pCtb9S~Kl3;T@qfAL(z%@D8WC4IX*N7cI7FVcWQ>ZVEaUMs zBosZ7)*XzFpDaJ+LI&)23em=TswqRYxPPk&OBR2`eXDLn(>{#$4x{C$7{63Pinj@n z;SD{;@WY>E_|6PzencS655-9HefJq7Nl%JTtPtm`oqpr0_$cDWjY4})DKgBNSK7S+ zDz+c6pY==L2fo68@i*XFKgJ&T4ueO(Q2kSaC#z-oOCQJa_A29f*Z+;>k6TFd-%=&` zw_}_!Bwe56 zd5V$p38q4m_`mfXw^<5`gK`8)Cns=EGB$9l8ofB*#U)&Nh9orCsiR-C9;d=~V`<}I z>^S0r$4QqF;2wrMCP|3ep9?#gVmvph#A>@5Yzt|`-2Z)q)81})IrKq0@du7&vwfCv y3}=+f@*DP#Z+b*z44ZN+%YWxvtM>i2&LAwPQn diff --git a/assets/heightmap.png b/assets/heightmap.png index 38acdbb9de5c5cbb8ec0dd263aec1446ef10ca63..41d76889d9b90439b95a7e64ab4ad6a7cb478e6c 100644 GIT binary patch literal 4609 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 diff --git a/client/main.cpp b/client/main.cpp index b56cc57..f7f6540 100644 --- a/client/main.cpp +++ b/client/main.cpp @@ -123,6 +123,10 @@ class Game { bool editMode = false; std::string loginError = ""; std::string currentUsername = ""; + + // Heartbeat timing + float lastHeartbeatTime = 0.0f; + const float HEARTBEAT_INTERVAL = 5.0f; // Send heartbeat every 5 seconds public: Game() { @@ -261,6 +265,14 @@ private: // Send normalized movement direction to server (server handles speed) if (moveInput.x != 0 || moveInput.z != 0) { network.sendMove(moveInput.x, 0, moveInput.z); + lastHeartbeatTime = GetTime(); // Reset heartbeat timer when moving + } + + // Send periodic heartbeats when not moving + float currentTime = GetTime(); + if (currentTime - lastHeartbeatTime >= HEARTBEAT_INTERVAL) { + network.sendHeartbeat(); + lastHeartbeatTime = currentTime; } // Handle color change with arrow keys diff --git a/client/net/NetworkManager.cpp b/client/net/NetworkManager.cpp index 37733f1..7175ef1 100644 --- a/client/net/NetworkManager.cpp +++ b/client/net/NetworkManager.cpp @@ -250,6 +250,16 @@ void NetworkManager::sendColorChange(const std::string& newColor) { socket.send_to(buffer(msg), serverEndpoint); } +void NetworkManager::sendHeartbeat() { + if (!connected) return; + + std::array msg{}; + msg[0] = static_cast(MessageType::Heartbeat); + uint32_t id = playerID; + std::memcpy(&msg[1], &id, sizeof(id)); + socket.send_to(buffer(msg), serverEndpoint); +} + Vector3 NetworkManager::getPosition() { std::lock_guard lock(positionMutex); return serverPosition; diff --git a/client/net/NetworkManager.hpp b/client/net/NetworkManager.hpp index db2fd8a..d91a60b 100644 --- a/client/net/NetworkManager.hpp +++ b/client/net/NetworkManager.hpp @@ -24,7 +24,8 @@ enum class MessageType : uint8_t { ChangeColor = 0x09, ColorChanged = 0x0A, LoginResponse = 0x0B, - Logout = 0x0C + Logout = 0x0C, + Heartbeat = 0x0D }; struct RemotePlayer { @@ -44,6 +45,7 @@ public: void sendLogout(); void sendMove(float dx, float dy, float dz); void sendColorChange(const std::string& newColor); + void sendHeartbeat(); Vector3 getPosition(); bool isConnected() const { return connected; } diff --git a/server/net/packets.go b/server/net/packets.go index 895a7d8..feb2811 100644 --- a/server/net/packets.go +++ b/server/net/packets.go @@ -19,6 +19,7 @@ const ( MSG_COLOR_CHANGED = 0x0A MSG_LOGIN_RESPONSE = 0x0B MSG_LOGOUT = 0x0C + MSG_HEARTBEAT = 0x0D ) // Vec3 represents a 3D vector @@ -181,6 +182,16 @@ func DecodeLogoutPacket(data []byte) (playerID uint32, ok bool) { return 0, false } + playerID = binary.LittleEndian.Uint32(data[1:5]) + return playerID, true +} + +// DecodeHeartbeatPacket decodes a heartbeat packet +func DecodeHeartbeatPacket(data []byte) (playerID uint32, ok bool) { + if len(data) < 5 { + return 0, false + } + playerID = binary.LittleEndian.Uint32(data[1:5]) return playerID, true } \ No newline at end of file diff --git a/server/net/server.go b/server/net/server.go index 730d8b0..69f3320 100644 --- a/server/net/server.go +++ b/server/net/server.go @@ -83,7 +83,7 @@ func (s *Server) Run() error { // Start player timeout checker go func() { - ticker := time.NewTicker(5 * time.Second) + ticker := time.NewTicker(10 * time.Second) defer ticker.Stop() for range ticker.C { s.checkTimeouts() @@ -115,6 +115,8 @@ func (s *Server) Run() error { s.handleColorChange(buffer[:n], addr) case MSG_LOGOUT: s.handleLogout(buffer[:n], addr) + case MSG_HEARTBEAT: + s.handleHeartbeat(buffer[:n], addr) } } } @@ -210,7 +212,7 @@ func (s *Server) handleLogin(data []byte, addr *net.UDPAddr) { s.saveUserData() } -func (s *Server) handleMove(data []byte, _ *net.UDPAddr) { +func (s *Server) handleMove(data []byte, addr *net.UDPAddr) { playerID, delta, ok := DecodeMovePacket(data) if !ok { return @@ -223,6 +225,9 @@ func (s *Server) handleMove(data []byte, _ *net.UDPAddr) { return } + // Update the player's address in case it changed (NAT, port change, etc.) + player.Address = addr + // Server-authoritative movement deltaTime := float32(0.016) // 60fps newX := player.Position.X + delta.X*15.0*deltaTime @@ -289,7 +294,7 @@ func (s *Server) handleLogout(data []byte, _ *net.UDPAddr) { s.saveUserData() } -func (s *Server) handleColorChange(data []byte, _ *net.UDPAddr) { +func (s *Server) handleColorChange(data []byte, addr *net.UDPAddr) { playerID, newColor, ok := DecodeColorChangePacket(data) if !ok { return @@ -310,6 +315,9 @@ func (s *Server) handleColorChange(data []byte, _ *net.UDPAddr) { return } + // Update the player's address and last seen time + player.Address = addr + player.LastSeen = time.Now() player.Color = newColor // Update persistent user data @@ -404,6 +412,25 @@ func (s *Server) broadcastColorChanged(playerID uint32, color string) { s.mutex.RUnlock() } +func (s *Server) handleHeartbeat(data []byte, addr *net.UDPAddr) { + playerID, ok := DecodeHeartbeatPacket(data) + if !ok { + return + } + + s.mutex.Lock() + player, exists := s.players[playerID] + if !exists { + s.mutex.Unlock() + return + } + + // Update the player's address and last seen time + player.Address = addr + player.LastSeen = time.Now() + s.mutex.Unlock() +} + func (s *Server) checkTimeouts() { s.mutex.Lock() defer s.mutex.Unlock() diff --git a/server/players.json b/server/players.json index fdb0455..c5a26b5 100644 --- a/server/players.json +++ b/server/players.json @@ -1,20 +1,29 @@ { + "foo": { + "username": "foo", + "color": "orange", + "position": { + "X": -25.698553, + "Y": 4.9015007, + "Z": 39.29553 + } + }, "sky": { "username": "sky", "color": "purple", "position": { - "X": 3.9765263, - "Y": -5.033655, - "Z": 19.824585 + "X": 5.9400105, + "Y": -0.055064563, + "Z": -3.896852 } }, "test": { "username": "test", "color": "red", "position": { - "X": 14.141681, - "Y": 2.2383373, - "Z": -0.06184849 + "X": 2.1930797, + "Y": -0.08324346, + "Z": -1.550154 } } } \ No newline at end of file