From f654031ae3be581ce40be2accd7c8dbbb55a4bea Mon Sep 17 00:00:00 2001 From: JAJames Date: Tue, 21 Jun 2016 09:46:51 -0400 Subject: [PATCH] Various updates and bug fixes regarding RCON v4. --- Release/Bot.lib | Bin 24762 -> 24762 bytes Release/Plugins/RenX.Core.lib | Bin 205782 -> 206992 bytes RenX.Core/RenX_Server.cpp | 77 ++++++++++++++++++++-------- RenX.Core/RenX_Server.h | 51 +++++++++++++----- RenX.Greetings/RenX_Greetings.cpp | 2 +- RenX.Ladder/RenX_Ladder.cpp | 2 +- RenX.Logging/RenX_Logging.cpp | 7 ++- RenX.Medals/RenX_Medals.cpp | 4 +- RenX.MinPlayers/RenX_MinPlayers.cpp | 4 +- RenX.ServerList/RenX_ServerList.cpp | 8 ++- RenX.ServerList/RenX_ServerList.h | 1 + RenX.SetJoin/RenX_SetJoin.cpp | 2 +- 12 files changed, 114 insertions(+), 44 deletions(-) diff --git a/Release/Bot.lib b/Release/Bot.lib index 378aaa3aa2052e1033392e15c1d60c868fd5d940..414cb5c7cb2f8a66ff0e903a623a67e77237749e 100644 GIT binary patch delta 1905 zcmZuxJ4{ni7;Y^f3bBm=`EcXby75l&+i%eK_4k|bH+?*$)~FV0Z)_#|zo~hQ-vAk_PDAl| ztEL2hGJyEnfKk9D*t6*=AHLhXMHvZfc6|+jC(fu;Dz&Ntel#`0BUcS%2kS)|i{86Z z9xaQ;><*Fr+ODsqqHRR9g8V_P)x&|kL*zVjBd3{gDv@J=6<2k+^U5IR{c_OG!^0B% zRp16kiov@0c{!OiN0LF#6hh~m2?m)H66~i?bHlmBU@{e$_aK~eg&CapOR(cY_`u~B zVaE`{$)S?k#fF|B4gH`oLdMOfPX!4@PSolyi6kA7;a6^3(Z>KsJoPes%421)lB_(q z9@4)$;&WKlMcUWIDAb2#Sn1_HG;-gIKDWJo##Ufiu$u@r5WzR5c4+Z&K~qqI?leZu z`*_pyWENk12>pP zpWEmH2-yR3#Xt$(2XN)ONQEtQYH$MITz{>KH~BV!Tdv zfc7{)K*e5u4Tg!}MRM!#;-~{0qkOZ>2_@^qgR(r1(Sm6nX4p-(fpg5s2ucPr;Q}FC zk_n&3OpL%<(Uat@5T~<~n33_&U;2PdVCd=4ik!vP&Uu{$_FJL ztt(wT+O)EHX})6Yuwog$&E`ZSY-j4^$7eTlpOr_g=cmv*M68{}`mnPV)~Cv+BS*Go sd8e7jYL=;BiK3Gz_*w7QCp&v9xNW1y;sUV@qiCWzyk)$Is{K{=B`WWEIP`wPF8nQB2Nmd@5 zne?xY_#9Ssk@ht)3iV+bRt|F?8o57=K6i$_jIF@3U^fwLAcAj9?a<=kf+oKN-6@RB zdwA1V$t=Ej5dQ5+FhOe1Cbu|JoSXpv6k!8|MzPG~;FOE9EF~&E`5>v8{EtTbQj22Auu)uD-4V>dnMo==42^R?A zl1%tKZej%13Ui#dLY&S{oM%lR1oH&e93@gcq~>?+eo`}E3|hssay4HkxFC(xPGTGG zCvI_T0q&UmFT7KP*%Ng$S^h-H*O(<4^^=Th>n347%6mpLdVCF&4ibuuP&Utc$_FJL ztt(YL+LW?+DZXOtup()`&6ZdrY^Uqw$7eVFfR#tB^HXRYAl6P|ec0Iw>r>^^kt16( rywl8MCBr@FOe(Y3LSwe%*Y=iK*PpU3a7-#i}A`=0wguk$*u?Yz$GocH@4`9323P(*ss z>@|~X)vliGA9pv-SG{)a;`G-eoH1uN{l0rVnO}DT*Fn)icf{5$OG;ZSx@HiJA;0ok>LqmWO;KbL}C^C>agoJJ`uHXt3 zAFWX|ojHVJ@h(>23KaI8#0OBQoJLeL<`5z#Xyon79EF>>0uVqU&r;?PBCEQ9Wg>yx zw>84S0}$tTY5WD#E3Cj3xKu~Oci|!vgp2SW;ZL}LaK4_#xv5ML3f$DlJ&6fIsV?w; zWB4BNQ6U;}aSlE|%$#zt3Zd*)jr>!Y1Bkb`YP^O22}^G%_{4sglCT|23E$_`_-Ql~ zgnJm6aDSY}uER_ac8}87iTi}_sV^|`Q;i2POc3%#Y8+XCAOt=F4WZZ(0{kD}ULz6_ ztpEm*Knye_M3vGQcbN%7;S7x;(4G+1+696(42TAELbl!-xcFEsK*BNl+DBO1ATAqIeOxC0OupdjJT zsTzMQV?rSYv*Hi>Xr>W^`AoPyeAm@FJT%(vE6qukfa}N{q z!kNe)q47%vCJ4*Hi}2Y-jYAt~{%-*B0*&;w$OFKeJ2WQXKH!uQ8l{IbhfosQ1LEJs z8Z#IZgj@YJ{#k)M0F>I#MCpbATsF6hM#g0(2x~FM+8yx!teYCU3Lvn61+WNV#fut0 z&t(E|3LbTVDOV6EFjhe<$z%$j%wdAC5*7_PvBatclu1Ovq4Y8o`v2st1;A^Uk3eQ^b@K(Sfi zpSX)TIl`FZ!-x0^Qv`6b_fQaD!bb#oT)`<3hqMbsgN9JHo<^C4aLYo>YYa~KqMpX5 zvzQ=kg_#N8T-4YItqEI&#9fmSNsD?(u@R1r%!pDTi zU_wIMIvS6|#Dw}T>P0i5fZ(bJv^}fw46L94;hzE8!9|1-z7qHVM!uo(N;xJ7FL%^< zJtq@{*PhjQbukl!R}e3RQOh)5y2*q>V_bm|`!%Y3!UQ21)*@5|9|h1?1$^BhG2!*2 z8ZSgJLFo6B#uL|>AUxSbqvc5^2-P73p;}#yy09XlW|+p1QA`l}Pt<6-fC)l#+#@^< zr2(I4vXm+Gg}({?;xsx!1HxbzRRlBv+8@+-u_F_N!4))m!rX*D?`hPIXM*r71|`%* z8=+fEjR7~97;pprA6ibM=2}P&q=A?)4F3~`Ue@RZ9}`AHBSNcpHEN&3KtOw@Q7e@R zLW2z&DF|pnBM7gs5m%s12H?X->S&DtwIC7DEZoIcxB`t~F2WNvG@egqf>8gyMn`B# zXfamfX;_TVeY3`({!9?+tkCELg$OU+h5zZ}sg@c&z<|)OuSUxT@HH?Hnh>7D|Af{s z9idaIMr*i%Py>7jy`R-cgGC50Y}M#;mI*@F2^w7*!2kFVo!`?KgU*DpMKuZzWr7ef zR-+^aEO`|7&TIS}hSUt?nX3^2p$OkK)>vJG356rL0*9L@I3=-C0^;^u`2RLKPX$B5 zoLw53*O>quKG6kICC5My(XP-GS1dx#Z5N|(g^Q4y2~IB5dW4*n6~z8;QRIA!|54Ne z;?4?H&5Dvy^d<9Dqj)Mo` z=mw2bJ(wVzhBXPN;0A*4cW6ae=3?KcShawIh>6LT!;ZOE&{$gr%Pa8RIRz(MaYhhJ;X=U40qX!hv11uJ08_z?Fy*ku)!&#<=!PpW8;l9> zexfm_E?fo7h5&?ji)#26GeP)!s*7k`fghV_9EK|ZCk}N*+yeMN6VXn%1G557^c)2- zr6~j__zjq3oL`_2Aoze|O*GDh!~ggYC%b5zz#xQ^ziFHeV?tp9uE4L&TQ=M;J|)^`^ZMW@PsViVC~|qe#zY4Qnh#DLKBUj^v=Ji|S(GC4-i(O~5T~XM?j0C1LQw|Y zi3tZ;yR?D*diEOVPrerGU;Iz59QJ$R&lg>e`wZ*g|} z4rf*GakjUFV0#h-YcNx=2jv87JXx@gWd-}7f?$;^3U)9_uu0`{A7%VVw10(rKgA2y z1pQKr3pO`OuyRKPi(f8S+-HK-IwV+9x?t=L!HxsJm2y}+A3ipga9GZN1sgnFu%kDH z+UvJ3hAZ~?M}2yCzmy5Kd8}X)?{n5SPO#fR9EUK#8~H#Z1gjhGuz^J!)-AzdSAfyQ z9hP3yVe!QrwgNa=*kR=gIjmWf!zM%^)bl#bcM~6Pr%>uAOZo#^gf+b*)J+MYJEOZW*It(jRDCe-P zWgRv(Kdx`1&s&1sSc?1m(Qmu(v7FxvHu@(px+mDU`{=Ywuu;45|4tB~?bC^Z#XJx! z5?Zc+IVXK2*b!K#JxpCW674{j7{N-x+?U4*mQfgj6cMa-7|aYz!k)8tHqfB$BCZn) z304#|pOVEKn3p!CyBxvp!*qLK!lp3O7cf&aEOG><>IG{YhBew>fb`IO*&h%HXokKA zF>rKV2#o<>8;|%X3YP)*b3%z+f=z&R_8@-3=Lr^(A6owc+U0_6L_BOjJS^~`VJ(7U z$D8;v0m77V*znR2qNKwXBPQ4k!TR5V<~aY^UrMlsrJ*6vWiGVMK)0`F%CQ4sC~#uji`<`Ti?d;*%4f@R+)Sg*YZ>K_C<4fr}$LbN6d))JBa*EBQ& zqt`(47>7;#4^sjt_kgpxVGgUd7#4sQFXj;Je0IV50x?(62LkK@kFXpLi~LHk9@$~B zFJXR(AVqLTMmww?VqhVZtM)cx=L^AReF_D(!v7b)fg~HD`BuT2ehc4h5$v69f_2&~ z*teSm>jo_w+=N!J1nr8t+<+D^>uCrv7G~~(LB@p(b_M2+K_C|HDcH~s_+AacI$W^K zCn4x#2;jC5{BfW@TviX31J1UE4=+E10f4FP1S>HD(`h8;?JMx*%Yx;6U9e|g6KwIT zunz7m8wGQ}ga8BfgZ7gu5G)xqRdFAP?hezVPs9tz1^ooO{si&?1UT6eJgOt$AXH3U zSgI!CV+exL*B^dwiZ9JE_|rJOYXZ&t!ffcgzauahT4Rud?IF;M2q1jl0S({lgQ-~? zeV@g5Fl^Zk(`o<&ABuPa^95Ubu_Vk2oX7XDpJDPmV2JyTzk_hAkq>|-hjGQMnR^>_QxTAJVE#;K&K(v8?0Sg! z0&Y7F8wIfcpj0lO!z$-=*th!;t+=kZgT!$cK{OG>u@2k&pWb+lo3C38l2)qEc5N-o};fW5L1=M{HY4RR4fcAag zf%zt5ut|dL1bWSfuc`eqm|TLk??bZ%NWb3*_R0p(e2wV^Y*-B8R$@A?f?J^NR9ImZ ztab##)m;LAy_q-@Bz%%%bi)1La1A?)*Z`XS z3ey8Ee-mskFbQVf3Hq?g@G%gEOxGzE3ILxVVI@7}Y*tjyb-@9cMD#``I}#nCf1h+uyrQrS%7Y=93;NVuH6YO$aF~6J*Du{9=$Ws<4y|kMYr2 zgh}wXY7ptaT)LpYNByYvSB~*|MchhLR{fWk$#t(uzYbAYQFF?fsH4}v_Af%fmZCB8 zm0LWo1ETd)Zt+~6mWpeasaP#ynq4{mO$6Ez%F5d6nOu5h725$Da zEhX8`(!)#it`Oa=6 zx(28-V;#j}_94;Pa*dVExhq3=E}jVxXG{_mluPSD@hHh1QCj8|qH=IYUm3UKFd+hR zN@K=*LKrg|L4A%e1|OQwmHwe4S_H;5lw-myrSboNVZ!+Tn%n#3Y+^v5H?dUissyQH z;VysifeA95dmSZ-p9-4_Ad5rT%*?}!$wBvdq)ffb3k0~G&h8G8Cx>`4a8sFgNDh%- zS*I}=6qdzuiW)NYF_F*HecU`ag6DK?6q{4L5a2N`r^|R{PLUG0*&`4n3Av1t-jJG? zOPG*K&F}iBG$crni*jMCmXV@NfZNbL?hsSL#jwCl$gYE^N^T>J8A9n(5!_11Z4siN zJe}KkTN>FKMHtz#1n@Tz!UVAKSCu@L+)TRVd5mYx;A+a0kF@%EXU9j8mbrCYFH@8?Gx1qX;{2sX|w68#A0PK&k{As;HmbL1CK1bk#}jtRQywZ=dBjigF(GY|U|u=B9tN|*Vy z0wRzwyk>f}pf!^xX~>5KL$ijQ5o6MZG=Wqs)&vsWjFnM0+>HDLELRs(D>0hak^>&{ zk^u!3nP&n$E>FdYiZUY~kC0tsv)EXXpBUrLqGNGJGNlYH0Lp~@3Rz`Lq+Km!B19Tr z4JmAWWn$^?!j{t998|>K+*-sn=ifzacatCn6txM$lY^RI(eU?tEX}?Zi`Y+@=Jc zG1KfzME};RfBF0}s)XsUGYgR^25BYiJW>p{1zLV7A?gRrWWq}Id8(x79we^1cdVq* zRR-2V*|U_1YUP(1>)cVVmJ-in~xr!E$^}QNW+!Zy!3MVv$zUW$}7VG25^R zbK+#>S|VD--vIC#N`-6kRNgg|4FuOA^{|$e+1y-N+uk&e=v>Fzob0Fk_+K6CM`LbP zQuKrXFUg*DMRi&AG11gW8E|&zx|SU#vCFP*(7HnUjD1{0tCDRH*u4TrEh@}=gsP*g zvhOw5DsAhD_k+fZmAUJ?Es6ETXMq+~r~Mgdd01cc3ADiXaWdm8*Q@gyh_^#pl#2Z! z(-^s^fk>LuNHp@42&YqAjq)@UQ#`#%BW1cDf?AB}RLkT>Hd2+8Dfe9YA8#xM1-Pj` zWt@s_5j z9HOj=nVYtYbM47^v>Ag$}|KrO@U1DiM-b% zLn2OYZSICoDrl!-7LQx=ge?BFHGy($_A(o^W-#ZF1Zv|(45>2qBlVHIVsg57Mqo8Vj1EhzW` zD|YAZR%BBj{MS88eL%~&68Qy)yb>aJd-G9iV91VR6>K&v2|JGZkJ}~On;Zw z53y4gme5+{9%`q(iRG_{T4yV3rVevm+8ZwY4uKW#>mW-Nw7J9^@r8yPh4th%_2seQ zw!SpW)3g!RXh!Y&Bdyxr`sC_Jo9T>lTVArtDUoSaQhpjgO1v2`YN#^%5T9pi@eZMx z(a3!1Wh=9i#N^yXuUJWpMTfjH=h^>sV_K&AJK zZ9(uO9i}w=2KhTn3GLmkJU7~ILe$RA?7mKow)-J-xHDvo-D8>q16A}i#F)R(n8RvS zlaKhq9SiCrHQM`62Sb$L~y@MLr)l{sX{=d*itrTchaV9oN0kBw_+HS0XiZ5cLB ztoO7$Io@sQJYIa{X({%GyZK%Okxs~-<3%Zd@tAu4%qMHe6XSyn3elBvB>G8G?sUZ} zvh$lk6v1b}a?P8@WY9;uvC)K}%`j1)TIq_ldxG5*nuEL!Z`orjvkN`+mf3|$v;XTl z(d_@c#yd9A8qZtIc7NMuNM+VP-*#nr__i(6&9EmX*)d(ASVt*g4l~A2$r5P9Tlu091h_)gb&oH3b(#0N zH;$yz*q7-Zjy(n9tC%W@&FhAeW*&BZRArjz=_+DOsm7wG9oLlK3zU_<>BjGh%A8;{ zpKk4BjQ4ZUO(j!{8Ln}9&JbzFYylDO%rGKIv#w7|x9d9jT}`7T$aD)TjX#zkyUjH7 z%!s6j9tY8F()(ED(5l9qE2PW{I#=*GaN8{FKspyw)~F1o_sH^9zvjh*$F>I@hx|b? zO&sZ%Ql+!*?^*?kqY{%iK0r#?)`%y{qO*-Mk{$=CZo_6<5!G63s?UFB2PI99@Jr@c z;mxT)b!kooypeWDnnvQ~ z?k=(;#*dSSmWo0$YAbe;sq1WDn_}gMr9s6?VDmKQBU9GEOWOREmIaMNyH!tRRTPFO zp1*^9@O{u2w0AapiGClO%1U|OJiRIZiCrg*QC5EvWE9e>!E*O}>v?EZoMLU!6D>$3 z&+@JOs3z=x%WbTiD)qBZgR0cP&R$J`5#U-<7F!{no3j%vtG2XDig&ifuCTL>3LQ1r z4=e0uz&K{m${>SL+ZBST!@mID}-lrTLl5a|87cBdOc>IzWn*Qoyz9Cx8E1mvTFG< z=XSZ*nR7c8Pi7hXXq{aKjUAG|46=j!TwEUb(ykI_LUdgpG$AO?O*tO*mB}bl!S?(&cHK6ch-=>jZ6avA_cyv+=YVT{aLw0_PYxB!l&$kNnX=WBE>mc#HSC!p zf7onOoYLN$a3yZB`&6@YJh8=0cWD;-_qUqtFO7>6wiy?DpI>d;X49Qn*y?|47dFG< z*tdp-F1*aS-0Ry7Ib||6Yv?gnGlXMil?t-?4y%=k#6>%7B$`4h;X4~vN`JG1|Li-v z$2JM9-%gvrjGTGCH*%Wo^y=>|AuW?iM0)$A4Mfa$xRmtmvLaH(Q3SNLN`+UecHm7y zwpPmEij3xFTTPZI7w*LMF~0npeSqRq^E}a^`Ncc%<0vjL-zEF(!E+i>cG@J0Tv~hM?+2v#ooZYQbbGyU~V3@uKInFM!wn=(2L?PnH+eVv2y?gy{{J z_vnn`7!;mtt9a2vNJUDID$_vf>&z?tZ)PuIwBmO|d8rb_sNP4mJz`ZScPOPE!w`K* zspNeXW%_ZiG~PJv2T2mT@X|zPo>WlyDMs|>Mt@@T+l>;z6vjG=imWpLR5JM&)Lg-g zJhkdTBI$}BdOTVr#fqlRAQ~|8pHd!9o=G|w#!1!$9z#nKTp5`J9|F~`b>St0`6$8Z zq(O~FJG`MZTB93fLxrM}Qdycx%3*TYuO^%o7b>OV=>dB!G!F-tzzT7n5!6Zj#wCQDL?}Y!B*Mrb^1x44(BrYd9P*gxB`Dv$D{6xf_j`_HM!}MK z_E&ubRY>jhGB~d3irOjI!4z`J;1qJNfZ4TcNpkEFZ^W4eMp=_yetK0FJ856Wp?yUR zX;}qLuW2pqZ*F2kg`*D2fz;u3bddFrVGo&ARTHI3LWmaExXe7xt7PS(t5nY^%LKB- zgL>7ol9~Y(R~qmw;`;D7uauQk(lV~z0HfC%CxQ%9L~hIEW&Ek-XuE2BK!nO7MEEu= zlDCHv(hw-Sd0uClBoqD!stp3+s?0#8{$#o454#nh0aOzW@QzG5Z!P2*dkO-iYFV<6 z8QLtNO29VgKNSL|^yKk$JWwt8-Bj;}cA6&hKIfyeJ|zgf^EO>3{3(jatrty+pk5GB z?G!sRsNKBYi84g*GnM6OpPA0_#>?1FPs^qit-Okip2R9PbjC1Kw*AX4@062O6RlaZ z)|vdCqi&k;M!t9Dy-QZUP(#gz1=4%*#-X*6+TPJ=jxs7e!kYuy zL%n#aY_`XnJtUReiflN@q$aEGZ@nR0c71`DlXb6T(cQCYolC*_&MDqPHq6Yzm!2mm zRl0-kJehLUp0}CP7u8OW^xuUJs-4am=gULau<@RM8YwsHu_TrDijYo1 z7HGmvy?KQYLS05vQKrbB2KoC$9yp)W)0C!x3ITd8b|FpEA%*a?`nolP5|1iH#ikj^ z7Rmpv+nS0}i?S%Cmc`_xG+rlE8a3(Y3{SD4R}GiQiZ_CGZ%D(ciPG=~a?1^SdQHW* zYHEk359OJEu@0v9$66fxLPRM4r9>HcZQ5I?e1w^K>U5%KvM2_WwUjb+HoQzx!5Uef z8LO=2d0XsbGF>BMT8Il93 z9#vFSkA6y2*KXDFm?1QnK9kGuSZ{@TbA@bl*S34k1Xj`r@!LzyxtApzXcM43LK$q8 z?0nB=1Pq`>Y>B4T#Gv?9Ja!Lyb;UD81}J38ANVRIxyHR%JeE_=qm8lRL$5V_1wQ_Sll4QD zq^+PLdj@1*({N)i;O&kO%Tbz+q*8z4?LBBNv@T$(PFk=8ZlF=5R7xy-UBG*9v zh&T6W*~mlU(6Y9L#F5(yIOazRY9iAinWCYxXse>xIt)(>$AvrIQVi5KeQm>-n+GC& zWhFC(isDIy%D2SRKQu8ZgjPMnQ0AgCX}fDK+4HO@D>HLB(H^6PW}O|7q3s|X_Wr+R z_)hCSoIgScPbIRGtUZWVA)bM7Qw5ds7kU1B*(TgEKP6F8c@8^wA*`#GNcJ#LRJ4Go zsHFvDH^!+ynAZ#?^Dx^3vSEW!{bv;=VvtQ4ND{64uPkK=hK zTg?Z0QnVk2lfy3a;=#3$Y(mA*4+yPBLl8Qt4(=sZb?QE(E zMMl-cPjF3on>Iw1W$mH!ae8}8={*djKSOVSa)%c}(||c5SAx+iJV)fQXve%0>sf>G zqp$o<;AJ^8HB?WU8b@W70w$JBvyzvZk3rspiIvIuAyZL5`BkK}0v}hT1^ti;|C~S6#`Am#Dp< z-`DIBp+nE()TE$C;FoDq?B5bkk1RbCND1vZYWo{PkADfp_QMIHbl|820ip$_0{Ds? zQrzhp)TAx125X4+tCV@p{KKosx`{Rwhc4`yE?pJ>=BFa%fq(1)GCdGcO11{OYcjcn z6L<$e$xFwKs+o=`u2XYKdA)>VUau%#($VK5h0y*F&&j&?NgJ6u@TETe2Fr|SQ7Rxh V=wc=PY(p`N0r3sFsiafr{{T5LMh%d=RsTd|^&0?b5lT1vR$3&SG zOq9RDM1^roREo#_<4lys{j$55sFGfdm>`U=q~OFSGKIK>%pt@I1#u0=5T}4P1f9tTOlkA_i*|oW&eMzP%d3YnVeQRNuuOT!H+5XcQR9 z96~`bL&(=qBM)={;(Un4FMXI$fD^v}zao5ute=yZQ1}8@;6gKva}${$oPo!LBDhb; zk9ZRjRw3T=kPk6Tl<$rB*JL6#kvXM@y2y(w0LBPna+t=%lS~laZK{wZzI&A^Y==_9 zuFe`q5MRPS^AC!22kGFVPT4T0$t46U3()W1)lK)X|7MirfN?IdqC+jSJ#w^r`z<4GUMm!18pqemluSWC={67$b;Y7&W#s$KV7YP4BV|EM^ z3!Y&j47v$F+}HRJx(FW?(l}TU;~zg_0W2cS5*iaCm{7pI3743Y&_W}A6Y2pF3-1AO z?N^N%s2PMC>ol(1Kpg-QV}Us+Pzc$Zt2EZsXM(T}eXNT>{O2^&_!>im@K#@qk3NT$ z!1n_cobXtt5QgDK2;HS1mZmX<_hAfSC3Fz>KCSWX1||r5W@&tzjQ;wxPY)+U}6$FCagzD z2p^u;*b15n|EZ(#1-vF~X|J(u0pgDz@nxpQ)*tZzuo=`S6u}i(y+-5uBqj(mE^6Ft z!35#zyBgt7BLRUt=tSWFuE6|N8u<<}q0kUlAb(%PKYw2)x)0RoxSa_?G8zd(c4;(0 zj0v?tBjL$6H0pfL1fi~r$9pqDsEgzxq*vEy2Nnn!$N@t7NsXad!dXY;<>eY9uQ8#3d>IM6__vE@xB|oHX$*^nKA_5NjiifA5UN5CAqldCtgf(@ z@Ja=Zo?V$B^edy$s4)|S#`85=B{4xrh9QJ%(=;CI%LJi%M~%$gOc44V)o5}F3(l!*aN5&uD;n@~e&^oB5D2>zcixV}aY#F+33JR-EZpi!$P6NC;K z8Z~mD2dH1r1roYG&=AHGQVVIcWlXfqqMv;l{iiTNc;Xq2X8A!CkP5m8X_GXbJ_}}m zdTlhGf|rCA2V8)$7C^TUje%bL^l63o(@)dI8r`6P&|s5B%UMhi2Er3U zd;Cpk1L_E!ax_{a41^TuA@o|V(Ho2qdWC5`Q=JKgA8-Y_%tHL}BRc<~@hToBjLy_3 zvK@;Kpuho*cyyRh0n>7AjUxyHq2NUqFsdN%)jW+=lb9f^E~jyDJ`;cwhnW%(H%}w} zH&3JFLLp&(l*XkxOc3rPGzwtpK5#EYbZ`!hlK z3``P^!x6$!JVW?tg~rKEOej>s705chj|swi9X0me#jFJ!K;{#+Kdte}yG#(?2TO!? z%Qf~C!mI{-gU$&%Ue#DTk_p1jnhFl<%Lrl_LI^kl3;|hU$KQAWmYkMlA*wA=4Fbf6;yBl+18(9M|JaNEl4` zd!>sCxMtz!^-V6Ka0Mnqh%hBmW8nrS6p(xif#0A&p&+in+v{8iT!BsFG&b&GLIHX< z0-wL3u>{W$J_c)9^z-o{jpdV=AiQ@{W5WX^8*muIhp=Rt#yv1bcz|aK|7L33xrHS+ za0>beKb6rq3g!r>FgggwU<~1O8^j+!;zW!KWb+B&$5@TS`_M7);}VTC8Q6>f#};Z- z?#P6~QCyKwp;*xXB4VXRvFg~)RmV!{w#NN2j02+Zc?Ev|K{9SUzz*dZj9bt}xO80O z@)RZr`*4r&U;O>wDW7D9cKG>|Cbuf_Lj8Na*x~u-2X`3JYxoE`;U`|odnctkkNITi zU%m5s_S-2bwcP#oEzVfvU!1l0hqLjwIV%}2SWGFwW?>clWI4g+O%ZHG8NqIp7i?Sw z!Qv|kcAV~)7Hn5p!SYuWtV~J4=En(^gXb<56725xf(`yau>LCqn}XpxW~N{nS%Os> zFIZx{!xm=6IaqZ%?8$3_ZJjPy>Vs zi-IA*5)PULJO{?6A>Ubh2t+}+F{laybu)@N>@H~P3`R{FgjYWz36-et`!ivHhJL$@IyElnJw5e3-C;s zVE5rb;)jA2`be;X2catq4YbXQn1KHQS|m7Z6B1(va^hFyM8*uk)*&ZuASYrI1)Bq~ z((vX@c)JGAtwRXrAWUBi*7q&JK8NCgNV?c?gfq-xyFwk7wp6fR--paf!JghL*oJSB z)O!R=#x-jtvN#8ET8zxCiv-*-O|X4XycY_N-sLO<7d22wBx4qYF2Tax&Cq#s!EWJ!mCs{r_eBR! z0}yJDPU7LwisvwFUV!C21pA{83QJ8q3*#f;)#7I{tOmgFLCB{XxZfLBcwc`oJcj&H z7VS|#reJ-<|400^Z-|UcMPju@?13r$k+DypqQR)$xIZaPu(L3xO+9q_ z6liY&!+?-(s0Ra))lgc$GvW`U7B@vZ?r&-UR$HPIw9je}_%WKzIbFBsAr z@ejiv)t|vo0cLf9XHc~GRph~F#IXpJ6~Ke>pfv$WR}`Kc0p$gu5SaHBj9Z0zuo^TU z6s#nw>FJx0n}&p(kMVv94&8@gK*&8L-d*IyL&3g$fNZE zn7s(W0VL~oB<&|K>V0^<4ovUC^WPwpI|Lh-Z4Q$4B9auCe+Z)mIA0WX9nTDhBPTKJ7QBHGfO|pEQ4quO z{$l6?G8Q3hKvqUchaCr|NhIFipc&ZoIy?iWO%^P23dZ+B&H zY=jK(#^-2T0^>f$a0DhThXG*W0az<{7`o851|cW}>NEdEqThksDa5}Fs0#vx%}znl zF(eu2i#Y+Bf!H5GCmvpcYsMLrT(ozr43>aasB9}EkUPb|3<}hk`<$IGj1F;q29wR6 z+o=7B|CGxx65*ZlU%_@bj8$a2*iQB}`;%YdSGb&)kEij=G9`$YaDL~1$m{udwDT+f zZQ~0;{2Xt7lfS{|;oxr(8^l-hRs4H?o_A;c_6{5K8Hb)dy zEzSSs9egc0|8iISUp~aWxgZ}&-*KgfJm778(iw+c6~a#5L&{~giUb7v%Z#V zr(E&SAYoYSIbBpzVXY6RLgo5AqO9B=B$9j&h23`_O2}g^G-Q69NBEJcEv%N;T8MR< zzPUE9Xr0@Ys`;#-iT&z)mb>J|aHZ4^m!k6d#S1>GNN*tuT2)wGoCUG$w9Gh}7UYeZ zB&|xU62ziN>|t6-S?VDVS@189@F|;9z%_D90r7%J){o--}MuEK7?BGq@(mmKn7u<=l(E2Wi6?v{l_OILb9q#Kp8=sixR z7XlIY!)&I-?{|BsS6B@5^?=B0vd@A;)yWhqU}J@j8_$`0%%SN=aI5)q$urU!dDc&4L3Ta z$>f$rY$lteJXpk&l%bR-$xvSf36PqaA`^nVzL*TDN*S`QOG)bAlOZOJ+eVl)mdU;- ze;4tHC^sl(xj`_Mj}*)l_}HijkMj5k0Yy*MNYTU>O~b!3kLalZ^CX|Zi^+#!h97AL zXz}89fL>ecYFt*_ln~2W#VE^~sUd5l{#Ol2jkYz!m-|__>e}Mx&6d@~i@wK`>xw8j>y{{@JiA&=yy9yytGGqU z!ncZ(=4OKwdvngWuHrL(H+vR$b74YtF~O%(^%h@46j6ccg~0Tu(%EP_??5xSXJseH z*K@1$vydBry4CZuQZhb;SIv%}8YCOkw7Ckaip#Mz-7?n?;scfVGl5E#1+mY%{{Dn_bI=RWGZbcDS=~KQ3Cz|3UHiDT*xc+^*WNS{3a)1(L{zE(udZhUY=WU` zKLz6@8QwtDkZ0?OW_~v6CxaVUbr>VAx(0r84S7?wq3g{cs2c@u#(mT?&>J1Eu`VS% zRlMWZU2(ZN)onSPDn9nLs72k7zulI#X`-L6MQQ7?*==drNW31C54weiPwaFc9)QE9aH7Ow^J@@Y--Y#%#Q889>?IE`ia@nWm zH}!C>7#;eQ%jo2%#B2{ckB@eFYyPxnT;_`6A`rqW@FsHmV2|Zd(p1-tovise1Kr$s zzOzjjuO-F0SW8SQ9qVFK$pl=bQfv5^gH-DIX+yHXJ9nteB}0^GH;68S=$bVdfrObI z+qq}$j*V`rM?2ur_wZ=Qf0_mMf;`ispkg;$9F+}nC& z77nX>+l2$o@5-6yV9aVbGw!uVO@4IdK^qV?67%&Dy?nXmtu2fCSYM43>Y3)x=Ni{E zELDQjuv||G9{QG=G0pzpgk@=8>jZA<3|3kj^|R&K#z?K)-3hm;L((da_?<&)66Iv?E8<{v6R6vY%m}T)TLq>yl_+JymLb*!m4T)X4;gCfuxi1(AU)Pb zLiG-)4zI}vcyd#T&DiRic4wF!?55sr9&QVU83qGhw5g%EfB2$Xm;0cruaS8TvpUHi zirXq=28(jy+Yy!?vnZYVl3kRVxvarR%dX+z@<_{p>VB+m-Lmv$TOYm74H;#fQ_q;0 zE#(zEvjsY{AI=;a-N{o@jme8%wI-`aO`%R7Z4EJ8#*MLD(ppt{G&8Ydg*XpzlQhI2!^#j6xt}d@CPmi}jF}t_f zS$0chPKM&f+YPGOfhmP)Pk_D%_EV`~*feue@%z zmF8?P-y7!qOPVe1gg5M#)@&XNPqmvzFMCs``myI*@`g^cHC0ji)->0SwbSf6-gG&0 zy6uuSv5KzhVBmMTY=%gXX){CxAE!fqa}#*c412I(?5sM|W2a8_k7im{%sEKPESqMe zQ>9KL^mzrTb2yFHl-2(Bqy2#^(Hs(2F*q8vtm_d_nR+kQJr6rG+sX%Y zwODysZLaM=Ntv^bJ98`{hNa1K?M*c?o_XMs8a_`v@8id7$Vc<6A!e3ukZosqVoteU z1%~|t$CjOllOgl%U^Rv*sd|vQP41sa3Y;v=`NP%u_WZ%bYuKAMUUYD#=tzRTd!R#h z-^@#9pFI)e>09|?PDUmyuqmus%wi%`S}#epGL=+6fT`Ux6XZT=9MY$dzT^Cah1OCv zXL}Zkj0edvO?Za9x6nq)IMnVf>ySAy`1vh+VqkJ@!rM02FdX!>tc>gkBZJUON>kq4 zGew$O|Is2_>k)OG(cKo?m5?d(cNY7VdEXL84JF!Y<(Cf^i!^!p9Z}wwD#~HAH3Z1abPN8Z?0!*|3}WspxVWOtWE-%l(#DRLD&!sQ13jO;e^0zHiHvc@5C|14DpJ zzT#HF&M+rRPWVtnXD_)_bHOH)$I>iIMt|tHEb*-_tFEvM7(?-?6}AV(q-Xt95?-ej z?IhRi_3MPT+_c$HYli5RcKu{t@0?g^Cji4okB|NMpj^E2v3t_j1rEhiMr~`-8t!-*v|LptJiA)F!3fzlOTpAg+tu^l(Sewjv`euzCPvAi3-srV< zcVOaCYMmcj6jL*qzP~P4B{DBUYOJ@jvZ=Q_*V}q)3dNueei`a}M;!c#eOv`-@+WSI zU-XIi%;&di8T6^U_sN0ZRY9m6x`)q`v7g!CQ9V}F&{UcPYU0y*S()Q6;lH=7hWIC3 zZYHBPc%y>Rs9AdJb2|{tL2vX%OPv~n=3s8~Mtd-4W)W5OX%?wLCa3Jh((u|@Z-3Ho zbZ(R7$U7Hg{l`YY41~g8_zeVFu9-ry?F(Bd6no~3@TJYU&IqHwbQ!PqrTE&zc=#5# zrTiAL*4L7Zg@H=U0$c4I?A-z^+nQ?&&~}@<(p~@_8Xzv=9eIqLyv^>Tl#OPw*>byG zY??Bsh{QkBV5u~idiF|{qj%V9r4*QBufsd+&eZG`XMSY|vzfWu?z9Emg!tf26Jk}F z&CBp%yKEUVbJOKrc5X5%rhaWyNacb#tgF1+ic_Id2}`fBS|A<6k}JtOyNz2W6Vt!3 znP}EW2fwlFBjvx@vp>7X?y60RivHG?C}ZcAZ>^os;kSYAvDb*}>B;w@34M~14qH=> zl#$iGGq$StBWm`g?NWxUx=)nOPVcB@9dFSy6# zNSY^j1LfQkrb?MD~@!Suo4TZ7h)lkd<;9m%Xvh|2SpV5FbG7Q z?Z)FDZHUrD6X0Od)awK<O{3S zMEgr}i(k75p0b~UHxl-T->4#29rq@Vvc&TZ-OFJ2P!AsaC_eOOe5%uGP&!H;KJRy+ zfH0~i3gauX-OqvUDs#x)S7FY!zf@$rd2B3Kn#l6e^27z3%(QG*2}R5HF>XRls9#a` zyl9UMF#2>tJprMylm>@S^2Y+UGPD)JXMp(LK-oo$lyPuAsTarFv|QUB8xoZ`6p}1b z+~^dq7AQ=GO3Bgr!gxxs*akHM#Z3Q7minJSI@g}UA}PQCn)Vba^iAMIx#OZ;g?pM_ zlWl*uO`b32CV};g2DM1HNn%~8aB8G%pj4Vn_HHYe>=C0b6id|m6zI89PWf&0cm!Uj zj>>xlaxl{<`_rM}4H8N_vEVe>S?hqt*h^}2^Q{mM--)D4f%lV`45 z^31YSwGT&oHnrEv-gdXT+#Q?Cb=t8h!7dP-FVkFa@EuWO>fFOH|_q$oGB>Q zx}tpnSX(zRUA}YEJ7?0$SqagRnuO5MDDRP)T6WNmUP;kXccGGsl+%939PBxsqmNK& zg`z}TLG&$G^x)5!K_Tk@@s*@epn^|dxxG#KJv&;R_j#nu`bjBm0ntSWT=#ywUVuWX zFp3bWFpFjSZNF_C?HoPd-Ms@X2mA5bvaK|$MLh%H#6y`y#dHY`{VNxELg3J+)vA(f z54oje{+w@`dQLOcD5g%87=7%Qqs0=kllMe;4wOBU^)k8s9+s)O&*7+kDfg&;y-PCY zODxZ6|9kK(VE{gFUz8Me)&yQA&>g4PpVWNYI-OU>nGOOunUE#cNr=@0LALStZ+X$M@B-^b~;A)D-tWx*cPtcQqo7-YS6mXbr!k#A8>of;n2D}ly=YCP-e z4b0PAa^jS1*qR`F$x^19;YKKL~4~mMu zko^y+n7zA8ZWnWXto8*GCwwq}#Mf$OZcv8N+^|{31v|y$*ugw{K@rD0-_W{93DUag zOA<8ya=}xpw#c=?j`?Q^W&xt+A6kHHg@>s!rG#U?c~t|>vliVZ4;ONt^3m?8729Qx z!j7pGM!m9()bEhj3tR3zVfjjq4e>T9qiDUclZ?vlnNSsOo4HfjMJIHMaay?S0^=Ep zDgHuK_>~$e{9h~IO2t{*jSdxI(y^N&+^%%8zY@<}{tY@AU%FcEcI6@2xE(AZT5Bx?Hs1I|r-92z`2_G!28M!}4&XV?NKK16$<)eN=J;4jdlNpO$|Xw+?uw z!S5+hNvFKiph-9tPfEBSh|%@ev7iq4PRIx=gGl(llE*k0ppP10o-{v7f+o#r%26HC z!sZxtm~n$Yjv#x7s2NDgOWHvkhnLACI3=4`)bn!U1f+V5;MD`9ltRx+<41_j8Nq8m zTGTU$f0Cz4K4Ku4!E_Q~+#c^4Oo5~26gj)>rt%=y!1O=+I8Cvd8A~2`rDz^k%+U$T z8B!K{OIhy~^Bkm{C1pM00+o4c!8w>eC+^Ya8z0YuuGo>>BZaKcX-G$sKSK*YTPbiA zqH@Qx^}is`B-lke%|)sknu~rxH%mtHW-|0Kv;Nb2PdXn{*+=F5S6QI6cb> zDpS)S_@~@f)=n^i6Z0jRUd~R;biA*~coL6ZhLP1q=~an|vgaJ^3M7V%!YbZ>aex|! z)4K9bgt8$TimuAS6`T~`ETr0>so+E;(oQN8?bmpI*5jqYnL~Q@VeOwE+&QVqkm1iK J^~ua+{|9EYzOeuR diff --git a/RenX.Core/RenX_Server.cpp b/RenX.Core/RenX_Server.cpp index 53aecc8..e1b6b22 100644 --- a/RenX.Core/RenX_Server.cpp +++ b/RenX.Core/RenX_Server.cpp @@ -197,11 +197,6 @@ bool RenX::Server::isFullyConnected() const return RenX::Server::fully_connected; } -bool RenX::Server::hasSeenStart() const -{ - return RenX::Server::seenStart; -} - bool RenX::Server::isFirstKill() const { return RenX::Server::firstKill; @@ -222,6 +217,31 @@ bool RenX::Server::isSeamless() const return RenX::Server::seamless; } +bool RenX::Server::isReliable() const +{ + return RenX::Server::reliable; +} + +bool RenX::Server::isMatchPending() const +{ + return RenX::Server::match_state == 0 || RenX::Server::isTravelling(); +} + +bool RenX::Server::isMatchInProgress() const +{ + return RenX::Server::match_state == 1; +} + +bool RenX::Server::isMatchOver() const +{ + return RenX::Server::match_state == 2 || RenX::Server::isMatchOver(); +} + +bool RenX::Server::isTravelling() const +{ + return RenX::Server::match_state == 3; +} + bool RenX::Server::isCompetitive() const { return RenX::Server::competitive; @@ -1289,7 +1309,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) return; Jupiter::ArrayList &xPlugins = *RenX::getCore()->getPlugins(); - Jupiter::ReadableString::TokenizeResult tokens = Jupiter::StringS::tokenize(line, this->rconVersion >= 4 ? RenX::DelimC : RenX::DelimC3); + Jupiter::ReadableString::TokenizeResult tokens = Jupiter::StringS::tokenize(line, this->rconVersion == 3 ? RenX::DelimC3 : RenX::DelimC); for (size_t index = 0; index != tokens.token_count; ++index) tokens.tokens[index].processEscapeSequences(); @@ -1373,7 +1393,6 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) if (this->firstAction == false) { this->firstAction = true; - this->silenceJoins = false; } }; auto parsePlayerData = [this](const Jupiter::ReadableString &data, Jupiter::ReferenceString &name, TeamType &team, int &id, bool &isBot) @@ -1894,9 +1913,20 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) this->autoBalanceTeams = tokens.getToken(17).asBool(); this->spawnCrates = tokens.getToken(19).asBool(); this->crateRespawnAfterPickup = tokens.getToken(21).asDouble(); + this->competitive = tokens.getToken(23).asBool(); + + const Jupiter::ReadableString &match_state_token = tokens.getToken(25); + if (match_state_token.equalsi("PendingMatch"_jrs)) + this->match_state = 0; + else if (match_state_token.equalsi("MatchInProgress"_jrs)) + this->match_state = 1; + else if (match_state_token.equalsi("RoundOver"_jrs) || match_state_token.equalsi("MatchOver"_jrs)) + this->match_state = 2; + else if (match_state_token.equalsi("TravelTheWorld"_jrs)) + this->match_state = 3; + else // Unknown state -- assume it's in progress + this->match_state = 1; } - else if (this->lastCommandParams.equalsi("bIsCompetitive")) - this->competitive = tokens.getToken(0).asBool(); } else if (this->lastCommand.equalsi("mutatorlist"_jrs)) { @@ -2429,6 +2459,8 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) // "winner" | Winner | Reason("TimeLimit" etc) | "GDI=" GDI Score | "Nod=" Nod Score // "tie" | Reason | "GDI=" GDI Score | "Nod=" Nod Score Jupiter::ReferenceString winTieToken = tokens.getToken(2); + this->match_state = 2; + if (winTieToken.equals("winner")) { Jupiter::ReferenceString sWinType = tokens.getToken(4); @@ -2584,9 +2616,8 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { // Player RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(2)); - if (this->silenceParts == false) - for (size_t i = 0; i < xPlugins.size(); i++) - xPlugins.get(i)->RenX_OnPart(this, player); + for (size_t i = 0; i < xPlugins.size(); i++) + xPlugins.get(i)->RenX_OnPart(this, player); this->removePlayer(player); if (this->gameover_when_empty && this->players.size() == this->bot_count) @@ -3052,15 +3083,16 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { // Map | Mode="seamless" / "nonseamless" Jupiter::ReferenceString map = tokens.getToken(2); + + this->match_state = 3; if (tokens.getToken(3).equals("seamless")) this->seamless = true; else - { this->seamless = false; - this->silenceParts = true; - } + for (size_t i = 0; i < xPlugins.size(); i++) xPlugins.get(i)->RenX_OnMapChange(this, map, seamless); + this->map = map; onMapChange(); } @@ -3068,17 +3100,23 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { // Map Jupiter::ReferenceString map = tokens.getToken(2); + + this->match_state = 0; this->map = map; + for (size_t i = 0; i < xPlugins.size(); i++) xPlugins.get(i)->RenX_OnMapLoad(this, map); } else if (subHeader.equals("Start;")) { // Map - this->seenStart = true; - this->gameStart = std::chrono::steady_clock::now(); Jupiter::ReferenceString map = tokens.getToken(2); + + this->match_state = 1; + this->reliable = true; + this->gameStart = std::chrono::steady_clock::now(); this->map = map; + for (size_t i = 0; i < xPlugins.size(); i++) xPlugins.get(i)->RenX_OnMapStart(this, map); } @@ -3195,7 +3233,6 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) RenX::Server::send("ping srv_init_done"_jrs); RenX::Server::gameStart = std::chrono::steady_clock::now(); - this->seenStart = false; this->seamless = true; for (size_t i = 0; i < xPlugins.size(); i++) @@ -3253,7 +3290,6 @@ bool RenX::Server::connect() RenX::Server::sock.setBlocking(false); RenX::Server::sock.send(Jupiter::StringS::Format("a%.*s\n", RenX::Server::pass.size(), RenX::Server::pass.ptr())); RenX::Server::connected = true; - RenX::Server::silenceParts = false; RenX::Server::attempts = 0; return true; } @@ -3286,6 +3322,8 @@ void RenX::Server::wipeData() delete player; } + RenX::Server::reliable = false; + RenX::Server::match_state = 1; RenX::Server::subscribed = false; RenX::Server::fully_connected = false; RenX::Server::bot_count = 0; @@ -3324,7 +3362,6 @@ RenX::Server::Server(Jupiter::Socket &&socket, const Jupiter::ReadableString &co RenX::Server::hostname = RenX::Server::sock.getRemoteHostname(); RenX::Server::sock.send(Jupiter::StringS::Format("a%.*s\n", RenX::Server::pass.size(), RenX::Server::pass.ptr())); RenX::Server::connected = true; - RenX::Server::silenceParts = false; } RenX::Server::Server(const Jupiter::ReadableString &configurationSection) diff --git a/RenX.Core/RenX_Server.h b/RenX.Core/RenX_Server.h index b7ef2e3..f2c2006 100644 --- a/RenX.Core/RenX_Server.h +++ b/RenX.Core/RenX_Server.h @@ -112,13 +112,6 @@ namespace RenX */ bool isFullyConnected() const; - /** - * @brief Checks if a map start event has fired. - * - * @return True if a map start event has fired, false otherwise. - */ - bool hasSeenStart() const; - /** * @brief Checks if the first kill has already been processed. * Note: This does not set to "true" until AFTER the first kill has been fully processed. @@ -154,6 +147,42 @@ namespace RenX */ bool isSeamless() const; + /** + * @brief Checks if the match data is reliable (bot has seen full game) + * This is based on the bot seeing the "Start;" event. + * + * @return True if this server's match data is reliable, false otherwise.. + */ + bool isReliable() const; + + /** + * @brief Checks if the match is pending (hasn't started OR not in game state). + * + * @return True if the match is pending, false otherwise. + */ + bool isMatchPending() const; + + /** + * @brief Checks if the match is in progress (started AND not over). + * + * @return True if a game is in progress, false otherwise. + */ + bool isMatchInProgress() const; + + /** + * @brief Checks if the match has ended (has ended OR not in game state) + * + * @return True if the match as ended, false otherwise. + */ + bool isMatchOver() const; + + /** + * @brief Checks if the server is travelling between levels (not in game state). + * + * @return True if the server is travelling, false otherwise. + */ + bool isTravelling() const; + /** * @brief Checks if the server is marked as competitive. * @@ -265,7 +294,7 @@ namespace RenX /** * @brief Calculates the time since match start. - * Note: if hasSeenStart() is false, this is the time since the connection was established. + * Note: if isReliable() is false, this is the time since the connection was established. * * @return Time since match start. */ @@ -996,10 +1025,6 @@ namespace RenX bool subscribed = false; bool fully_connected = false; bool seamless = false; - bool needsCList = false; - bool silenceParts = false; - bool silenceJoins = false; - bool seenStart = true; bool firstKill = false; bool firstDeath = false; bool firstAction = false; @@ -1012,6 +1037,8 @@ namespace RenX bool spawnCrates = true; bool competitive = false; bool devBot = false; + bool reliable = false; + int match_state = 1; /** 0 = pending, 1 = in progress, 2 = over, 3 = travelling */ int attempts = 0; int playerLimit = 0; int vehicleLimit = 0; diff --git a/RenX.Greetings/RenX_Greetings.cpp b/RenX.Greetings/RenX_Greetings.cpp index 4a884c6..d54a2d4 100644 --- a/RenX.Greetings/RenX_Greetings.cpp +++ b/RenX.Greetings/RenX_Greetings.cpp @@ -37,7 +37,7 @@ void RenX_GreetingsPlugin::RenX_OnJoin(RenX::Server *server, const RenX::PlayerI else server->sendMessage(msg); }; - if (player->isBot == false) + if (player->isBot == false && server->isMatchInProgress()) { switch (RenX_GreetingsPlugin::sendMode) { diff --git a/RenX.Ladder/RenX_Ladder.cpp b/RenX.Ladder/RenX_Ladder.cpp index 890b590..0e04b0b 100644 --- a/RenX.Ladder/RenX_Ladder.cpp +++ b/RenX.Ladder/RenX_Ladder.cpp @@ -42,7 +42,7 @@ bool RenX_LadderPlugin::initialize() void RenX_LadderPlugin::RenX_OnGameOver(RenX::Server *server, RenX::WinType winType, const RenX::TeamType &team, int gScore, int nScore) { - if (server->hasSeenStart() && server->players.size() != server->getBotCount()) // the first game doesn't count! + if (server->isReliable() && server->players.size() != server->getBotCount()) { char chr = static_cast(team); server->varData.set(this->name, "t"_jrs, Jupiter::ReferenceString(&chr, 1)); diff --git a/RenX.Logging/RenX_Logging.cpp b/RenX.Logging/RenX_Logging.cpp index f478370..e3bda27 100644 --- a/RenX.Logging/RenX_Logging.cpp +++ b/RenX.Logging/RenX_Logging.cpp @@ -562,7 +562,8 @@ void RenX_LoggingPlugin::RenX_OnJoin(RenX::Server *server, const RenX::PlayerInf msg = this->joinNoSteamAdminFmt; else msg = this->joinAdminFmt; - if (msg.isNotEmpty()) + + if (msg.isNotEmpty() && server->isMatchPending() == false) { RenX::processTags(msg, server, player); server->sendAdmChan(msg); @@ -578,7 +579,7 @@ void RenX_LoggingPlugin::RenX_OnPart(RenX::Server *server, const RenX::PlayerInf func = &RenX::Server::sendAdmChan; Jupiter::String msg = this->partFmt; - if (msg.isNotEmpty()) + if (msg.isNotEmpty() && (server->isTravelling() == false || server->isSeamless())) { RenX::processTags(msg, server, player); (server->*func)(msg); @@ -2032,8 +2033,6 @@ void RenX_LoggingPlugin::RenX_OnMapChange(RenX::Server *server, const Jupiter::R msg.replace(RenX::tags->INTERNAL_MESSAGE_TAG, map); (server->*func)(msg); } - if (server->isSeamless() == false) - server->sendLogChan(IRCCOLOR "07[Warning]" IRCCOLOR " This server is using non-seamless server travel; this bot will be disconnected."); } void RenX_LoggingPlugin::RenX_OnMapLoad(RenX::Server *server, const Jupiter::ReadableString &map) diff --git a/RenX.Medals/RenX_Medals.cpp b/RenX.Medals/RenX_Medals.cpp index f02adfd..c14bbc7 100644 --- a/RenX.Medals/RenX_Medals.cpp +++ b/RenX.Medals/RenX_Medals.cpp @@ -138,7 +138,7 @@ void RenX_MedalsPlugin::RenX_OnPlayerDelete(RenX::Server *server, const RenX::Pl void RenX_MedalsPlugin::RenX_OnJoin(RenX::Server *server, const RenX::PlayerInfo *player) { - if (player->uuid.isNotEmpty() && player->isBot == false) + if (player->uuid.isNotEmpty() && player->isBot == false && server->isMatchInProgress()) { int worth = getWorth(player); Jupiter::INIFile::Section *section = RenX_MedalsPlugin::config.getSection(RenX_MedalsPlugin::firstSection); @@ -170,7 +170,7 @@ void RenX_MedalsPlugin::RenX_OnJoin(RenX::Server *server, const RenX::PlayerInfo void RenX_MedalsPlugin::RenX_OnGameOver(RenX::Server *server, RenX::WinType winType, const RenX::TeamType &team, int gScore, int nScore) { - if (server->hasSeenStart() && server->players.size() != server->getBotCount()) // No unfair medals for the first game! :D + if (server->isReliable() && server->players.size() != server->getBotCount()) { Jupiter::DLList::Node *n = server->players.getNode(0); RenX::PlayerInfo *pInfo = n->data; diff --git a/RenX.MinPlayers/RenX_MinPlayers.cpp b/RenX.MinPlayers/RenX_MinPlayers.cpp index d2ba173..75993ba 100644 --- a/RenX.MinPlayers/RenX_MinPlayers.cpp +++ b/RenX.MinPlayers/RenX_MinPlayers.cpp @@ -38,13 +38,13 @@ void RenX_MinPlayersPlugin::RenX_OnMapStart(RenX::Server *server, const Jupiter: void RenX_MinPlayersPlugin::RenX_OnJoin(RenX::Server *server, const RenX::PlayerInfo *player) { - if (server->players.size() > RenX_MinPlayersPlugin::player_threshold) + if (server->players.size() > RenX_MinPlayersPlugin::player_threshold && server->isMatchInProgress()) ++RenX_MinPlayersPlugin::phase_bots; } void RenX_MinPlayersPlugin::RenX_OnPart(RenX::Server *server, const RenX::PlayerInfo *player) { - if (server->players.size() <= player_threshold) + if (server->isMatchInProgress() && server->players.size() <= player_threshold) { switch (player->team) { diff --git a/RenX.ServerList/RenX_ServerList.cpp b/RenX.ServerList/RenX_ServerList.cpp index c4c831d..06420db 100644 --- a/RenX.ServerList/RenX_ServerList.cpp +++ b/RenX.ServerList/RenX_ServerList.cpp @@ -399,7 +399,13 @@ void RenX_ServerListPlugin::RenX_OnJoin(RenX::Server *, const RenX::PlayerInfo * this->updateServerList(); } -void RenX_ServerListPlugin::RenX_OnPart(RenX::Server *, const RenX::PlayerInfo *) +void RenX_ServerListPlugin::RenX_OnPart(RenX::Server *server, const RenX::PlayerInfo *) +{ + if (server->isTravelling() == false || server->isSeamless()) + this->updateServerList(); +} + +void RenX_ServerListPlugin::RenX_OnMapLoad(RenX::Server *server, const Jupiter::ReadableString &map) { this->updateServerList(); } diff --git a/RenX.ServerList/RenX_ServerList.h b/RenX.ServerList/RenX_ServerList.h index 3edc271..3179c98 100644 --- a/RenX.ServerList/RenX_ServerList.h +++ b/RenX.ServerList/RenX_ServerList.h @@ -39,6 +39,7 @@ public: // RenX::Plugin void RenX_OnServerDisconnect(RenX::Server *server, RenX::DisconnectReason reason) override; void RenX_OnJoin(RenX::Server *server, const RenX::PlayerInfo *player) override; void RenX_OnPart(RenX::Server *server, const RenX::PlayerInfo *player) override; + void RenX_OnMapLoad(RenX::Server *server, const Jupiter::ReadableString &map) override; private: Jupiter::StringS server_list_json; diff --git a/RenX.SetJoin/RenX_SetJoin.cpp b/RenX.SetJoin/RenX_SetJoin.cpp index 08af531..86db478 100644 --- a/RenX.SetJoin/RenX_SetJoin.cpp +++ b/RenX.SetJoin/RenX_SetJoin.cpp @@ -26,7 +26,7 @@ using namespace Jupiter::literals; void RenX_SetJoinPlugin::RenX_OnJoin(RenX::Server *server, const RenX::PlayerInfo *player) { - if (player->uuid.isNotEmpty()) + if (player->uuid.isNotEmpty() && server->isMatchInProgress()) { const Jupiter::ReadableString &setjoin = RenX_SetJoinPlugin::setjoin_file.get(Jupiter::ReferenceString::empty, player->uuid); if (setjoin.isNotEmpty())