From 55727d5c0086f6d1f55be7c582cb2bb9bd14f57c Mon Sep 17 00:00:00 2001 From: JAJames Date: Mon, 8 Feb 2016 06:16:49 -0500 Subject: [PATCH] Added more team-specific data to LadderDatabase::Entry. Added tags for the above. Added HeadshotKillRatio tag. --- Release/Plugins/RenX.Core.lib | Bin 192096 -> 192518 bytes RenX.Core/RenX_LadderDatabase.cpp | 138 ++++++++++++++++++-- RenX.Core/RenX_LadderDatabase.h | 17 ++- RenX.Core/RenX_Tags.cpp | 188 +++++++++++++++++++++++++--- RenX.Core/RenX_Tags.h | 80 +++++++++++- RenX.Ladder.Web/RenX_Ladder_Web.cpp | 2 +- 6 files changed, 384 insertions(+), 41 deletions(-) diff --git a/Release/Plugins/RenX.Core.lib b/Release/Plugins/RenX.Core.lib index 18856477542b8cdb6e45458bf817051500028cc6..bd893403cff11fe474284dfe5d8544d91938b37c 100644 GIT binary patch delta 20842 zcmch9cYGE_*Y-Ih(o5(d5JE3Ps47)LRXPaLqy(gc5D-Ku-hhgNR09mXiS#N8NN-|8 z2o?lsL6F`bML~t{Ix~CEW&?iD_s9Fa{(e_B**SaW^f@!Tn0O-Hn8b9G^QNp^p={Y_ zD(iLkIajD$g-TKKUu;^U$KE480vz2!eC#%<$7YeD8KgRIA=P#V@qIxndTsmm66ar7bb%%`-uV7tfc{;x=IG8yAuQIod}DjRY(E+XDJWca0O2PEC>-NcD1-wk64fh zMu7UYk;N}>k`kPcv$#N{3?||VoP|{c=gNB6fh%z4rbQwI5FBY|@%?mCf}e&0A^bR+ z+QU>_fgd(n{8)>W0W9+)@O@f~!(b#>1+xm)-nUpco|IsHE{oM)k`kID}oS^S1*2UM4O zqMT_qSkrEs}XR-Qe1Q@Uufh1Tt#$pAmDR{gjFiV2WV$^6-f|mzc zOz#Q*VY#i9=w3x=(-_;4R7!HLTrYT*hTpKLK;2Pwf22rn3ptPsrhFl!?z!ORaV zW>v)BK+002R3wVq6Co6t?iL+RkrIroVsUahDS%JF=Yr#VEFcVvK;OV}f;ckZ|1=|m z^Tmk;zb^Ao5?5Ga11!=7{1y0qJJe!K2-=PT4ji#~XBny%(6g1rB|IoN7G-h02~rKX zw$7sU8e{-4`kuubhy}rF2oq9=5Q~-_Xb(~l@b{ToQ*ID@mZvq;5Lej z;9OAy)dNxje5sbj#dSzQ;F8?KSfz0mWf2d8bh|8`hxG)Juz(;7+$kuT)*@RaQi2=? z@P9U#UyvPs5tRJIq7=+#5P>W3WJinoaE+kBcNPs1T!IG5A~k#~NZZ>YO;J(?U*ZZp zJ=&sCOHz$O_)%rJMNDc^g1q}IB6C0kpvXFl^aDu=(xtb^auJ#V8ID-gT|r6^v&ABR zKT?8%&wKa{S0LYO7SB$EYvo6cMi%83kP_5|CW2HySd>{rN>CkXBd7yQ2r5^!sD2Rl zflN0oO7|lr$U5EPscobLwTfHRYfnm$@onTkeyD137SEk0We|lcP#KyD8bcUCQKYIM zVxvX$cccWF3R>hGPfCyr%muljfZ&OV7R5)C5|n6SQL{JvUlV?cI$=>@94SE_m`sp2 zrA3Z|2pFI&G!ztWW>IJXDZw+*7PaS*5@deUqWpbQf~ZJ~XRd<|$c=y$6bVJ(2T%() z1=09jP;9?N`7U4p6f0?w0gMDy5hDg=aRn;==Ajv`K!sHnjlYEDfF?5x`1gura1~hv zs89+pOR)quR~V=d8=>SP4X?GgxVjmHn@PpPmx4DD*@F2~EiPZgA_eSt-J%1874)cM zu@UYOeDSvjJo^Q(|5<~O`g|K1eBF$=7Oo<-8hS7T}cUsl(HC| z1*I048DTM_FDbzXZ(58zhxG$ExY%N9B{VI-HxNoNDAM8}V(VZCKR&o;(LRBcK@(ho zPhlB@XK@9(E%8toSD^bw4`ALM=sLqgUR;3<5K8dzZHonPnE`}f0GwU}|I3e!&s*$F z4^slimRY>Chm_zn?g>7bXK|nk7Av6tP>X(lk`laf(4rsi3ob$k16blB&^xuo?mB4m zfL(i#|M;QWo%4X3?SMAWOwhKLMW3?h3xM9^Ej|W~VEtl?SE4a7(08Q8xD;6RfU!+1 z-kU?pAS13o+QfDUYCg0aCTG zIGzKYP!8;f7F#^P?nrR$w#D^+#DY6f7S}K0Z{QDX;RFr-K<*1p_V#ccSKwwVi&Jsf zRzZ`WVS&Byv0&3ci_KBkk^yrY2{y!LywoCoa`tTTFSN|A7tG|`I%+qkj-Qb|y}1+9 zgtO}YPjW`Rd^bnOAE;t}DW*?1<}~pcs;1I&ns70lu$xoKbD8AN;yST0r`BUXQ+4AH zRn4|x^2?>(4enkmm-Tk92~70f5vDCinQk9rn)R63y3&@;igvVBwCDj-7Tk+uMeT1e zJ%603>+6a-4plT}o}y*3iiW?Ss8tI^*RLq*3LLzo=;9VdmpdxjyiL(Bn-vwl&$Ryv zQ_E(Gu7*xAbwAA%@s6S@O%;{;lW809GwyXwWU60o57{abnbbqa)(D-$V za;;bN3iP)BFf9NYTxL1|Z21j>K=K7Q6jcMhyRK;7&-lF!CTpc= z&mb_Jt?0xQSZJD}CW{mu*{vvckD{Vl(bvEaQ!$RQqOBE;--qn^?k3X_5VjhuXdf&v z^$z}qd8hxybf-Cl`I~7Du;T(#rHe2-gs9g=(b1lY7Qht=x0zO)W6JdgvJg9_wDT49 z?xiTYv!a-mQ0_%V*{&&i`>LWgmlciN3O999)L=UV_$&lQ@I!;UOo>3>GfaO2`(gHR zzc6KliBG`vZD8L0FmGX)@*+$;=sQK{V8*9mwZ1Upn3am|z+xpIS2PP)0luS0DH`~) zqMp+gb=eF0K8jXBzDYyb# zjqV7dQyt*vk?`?JMbDpL+JhjxjBCbk5EpTZn*E2V_<5#fzcQ5s?rgv_u-0_&82T-Q z7z39afdAit#bLovNknMWG589;Tn96)fnV;8hE-tBJ(D2ZI0*DU{+knnj35D9Iwz^5e@RmukBfCjiu&#veb+}lw~Q3TNONoZ3a z0oeeSYlt|&b!ckDL0SY_8U!~m`e_7sBlx}wf;9$i$g3zvB&1(g1b#}dC_N^EVo2o;II&fKKq#1s{nF-I9 zhM-v$ZF@>l@mk1;dI-XdNa1RV&OZmM14lx5KpNBTMPcR$Xb`QaARZo{6A$FV1i3Nk z6Og_*TvP%Y)kLgBDH>M*g5^<^5?UODRc^v+%?d-XLWullke0PkFES$?%fmgOzm9uV zz$*gEUWYIdm}h@6_`eGXO5&GDXuYp0{0jV55zK&96<|6DH=_wO`<|N6^ib?vJNyo8454(^Y74XXf!0ERi59Pi_IP+?Uqva#LCUd;=DepU zBk*1v;$;MU2Mm1;rX36c-$s-#!~_Fi6_~f$SD^nA%D~KV%TdyoBJvj_=$0XNaJ`Cq z?U#TS2*qOX03PlLa~??vbEiUD9ET8Cr3z!kyAA*LyUrAavV0NO$Um5t0KHE#T?bmB ze8*uCEBZ6E-iu7ygvj2EEP-p@dyFVOt)i8*n!e<(_#4hgkyMBZQ&Ad8qv$RADMUx< zXX-~A=wn(>-_iHfgL=|QIzgwX9z93(DG$}-M%MEFc{}gmbbOnBqu=R2be}?J z=pU-i#5p;NGjk-D=X3OcvhsPlNSEjWmEr_spc?6H-5Vzptw3PfD|k7- z!t*Et^`||Qk>YUFKcANJGH${L=mT0#138}h@owtDD>*-Hp`N^%`tV1*m_Ou2ypKMQ z|M8E^FAm_>xiJsow$y^!(KKpJZ77cW^CJ3?7SaN0P8~UcdvhilKuviJzr(9|E4QSM z)PQHwC%lojaWCG?pYaynz&-_`(abw!ab7(frq80QqkLP#eZ~d7s6wgz68)c{0sTpUZtTcpP zqn(5!VM5*bzh}q)L~@k;f6tEi0(Y{8p5y0vGEJeylss4dS5hVP@4527kSeJt^zYe{ zl6upp$eD*zrqBOe(nS5YtcgGTNA~}J8PhAAF`v-?Le69##|IvrHR+OM&4%1}GrpK~ z6If7}+0BK++rDz)Us7$thHv~pM=2Y~P1p#=Wee~4nqA?Xdi9T->9P5*Z{D=?M}ACs zL(`98VLzPS?k2c4HSm5KE-i?Ys*sQQVbes!?iAHYsh{}NIF+-GJH#)&Z z!vtWRQ%^d9eQ*!&!|c#ZK{aVHpx{c+?9|an0~eBiMseoYm-98B?W!`2Fvd z(pT>Wh0;+<+1ciw<`e@4G$({yTMvtvtaGo>k*hF@b1D00ShQDyzutGluMZmYXNn*@#;fY_dQO-T7rMm^7S>6Pup% zEL$36StT(3enP){j!PuxWy~+UvRR_|$QEgI#$R1wfiI zeDYWBlXMD^!{{;WJU0vvfTamXVVO(cy1?1u^IR~|=u!e-3|N}tpvf&XIrO9pPJC@# zw=;#Z%&%PFP9AgJ?4l>ih>QHPyD16%&qXh=3xa1}Gp{aviHn5A3J1SYSAstu)J-gw z`_Z|g1GyJzNDC%Q5|j!ggyB~L{PKJJ4xV%g>N1J1xJ=S0KQ@R)T;bYb71l+oTzcdz zmBpB@1=tnTbFV_Jh^yQ(Ok~W`|4+~6`l_>lo2T?OH;)Mvm$A#Q1vA!6QwY-()oZVD zcKz&iUuZbcI8|TwpAmDIo0)I8WOTDmx#4Ejt{h~z>B@l-#ijG8n~sB@e1XKiCP~HX}Aa&CB^7-=yz`I zLO{yL%AdTEws%~~OlHb6cYISy%`}X9{J|X@qi}UJBY*tCF9k*<%1n&Zg^pEqfx8^7 zaWwWs()GlqX|L{{FnR8B=Kv3vz-#aN3B2p9Crr(INrVY6k%#a3Vh1uX25w6zmoq-@ zd^$b;PSAA^JGrKzj?xeQ@?GNUyirT)d@X(EZ;lGHbj8UK?o^&u$N&D9$m{fvA9+$+ zTzsESHqfD)$EwqPS0v?|DeIGy_qncTHK&Jh$%_wsYKUa1zklG{Cu+X6)leQ>W>bXA5$n-@ke&?R{VBwSxb7Hbmo5CNN;;wIgf=cp);p+rqIpWc+Zu>bFCyx zC-mb;ef*dTF36_x{#{9BF;>r%O1Mgm1YeaNvofBFZ)d-H<#Ek4wl#%Ar8Jjj2k~3 zJWk*;1$`}?z{d+F6Zo}4o?G58q$Y$_LD{jEXjs@c5A1AjUMZ~J3R6Z5_iipMqNapz z#+CC#Z3t1{hN$u7mYc9}Er{`%%R4US=iTID9>eX$)XXqLLq5H#C+XPYK6#)3zb96? z6+!_{S_p;2xa39&H6+Z@ghoOgkK@deerT8x=d6ZL`p$Ajy!)gxq7+ZVe0eE9A&pm` zF6}XISXxaAPn%fUBhL`+=a{qh$!Oo&t{9Fe<4a&Nd2ri+KzOlr-soS+_l6PPt)ZDK`)jB%r(4rD zRrc33Q&L^?*r$r}o5ygGcu>XHAQ+!3tNQWj3U-fbzC^}oF7eV-_q8^RTy_4cx?e-w z6h{BP(0?iPUpTtGZdOVK4+4x@vLGAM&LCX|(g|<0e7INy1M2r0$pT91ucXaKV4mdRd3`=FS8jLLy&PRWGu6K zpdQg!xyma6Xh0Qo2bqf9-Xzk3Uu zB28-Qx7f13G7MwDaF=B#-5Mc<0<=&^IF zB)b>c7;pW>lj~9|72X)T^MxU;l{@{!^fn%EwN~y#P_`Z>mPWMkcUI1lciZ@ubWKvI zt-mfA%cN=NNszyt-w?Xl{%PmWCc7WAr!5aleWx?GR|WLCmsIhvIgN!fb@bS!YwvHZ zoSbvp`*J#?3cnkZ0e}GIl*4_ zZZ_?dr1)d2Ygj!6RzC}?s4T_w{8-1z?nbx2?CH}h*0+S1$2?mN&z`_mF+OvqXx+4D zvVE3mtJm)J7>w%t2#Ioc@g;K2&FU_Ga}(HICW@Gyzlzk8clvp2(p$td5>?YLR>FYQfxrOruk$YZ`C|#|GQ_oPzy96WHlpc=|**q@+aY;PE6)K1)T#fL=*j9%MU6?2gt?qJfq;#Mhlx?^OO zgZtY$(<>^Uj=SJ;)mhcpP7bO61KaB}^SO}j)Xz7bt0kZI^J|Gq+^YTk#0?yx-GPNy z9V@7>_4iq!>9MO>cg*$&2og`W4OkBLvBm6eoPRK2%qgZZg34ljSAt}~wq}86rRp00 z%G;WIV7_Zxc^w+)&u&~RFR%=iyukVkVSK0@7Yzt${4A&ACfeG*>NhG0;TrPKt1g1g z(T|PGL4I9J9OPA-41*uh(ilCuV18ogap-tU9Xr?syBsRy(y}QqWU)deWM_81pc6*> zWX=OQhxi^aUFEnTp6v67_>m_aieZR<`9mqdP)9B1F8clupQEvlyqq%jkweSJIYs== zwk5+UC^x zM|+jysnKeCc*NE6B5(PHF&M;4-|`(~gmDW}!?)dnB%3W0A#!e*Qz9h)3a%3fP4ldr z5gA3^c}MjK3t?i%t&{o3`0Hd)`ITdQ<;{8{t)byo|6PB*Fs^mY|4;Aw&A(I-Lq7IB z|Iorjy*rPpG1fniGFCe~)|=w)SoL{WU^8-joHuf7oLcLRxbETm_nm39Yvuclcdh*N z37#mWC#Vf!wyp&=g?AP#Sy&Gkub$AC*YMy#xq@A+CjU(IO=2{0=P0u$`5RBS$25%l zgK;svaFWUvpQ)oMgMrX?`{tZe+%6U6-p=>g6u(Xx=g4|w9N!3BON!&qtm9{sI^OX+ z{DI@AWk+ukLr#TCAu;0inuh|C_=onHrn)j^RvvkUVIG$^#?eTd-7#2r7Ps-!Mmj9x z>zvd4a55H>9kqG(6+BxO&t|U4v67U*xr0g2dAdsi(Z@V5psC|1#t3C2mH$ zqj5gXv())C$ZP&m$ICwAoLyj9QfJ!?UAfG!DemokvE|8T4Sb{15*1@|(Ncj{(=CVP zRwOaCEYt2ogxxFD%VBr9MaLLQc0H}Zv~1Dn08_Wj7%KTRrwypyEL8SkDz|YRu*wfa zH;bu}GD|yYDPoG0PR_vEV$y2ATDcOIXHDQH_P5~|lS|hmnJV0o7#vB8(HCn2 zjQlNVtO#|wu+cpbBibeX>2-e6n>@zBPPg0! zztcq-v$i<4!Oa*9^*288LtS(;tD5Yjd+N|9Dl)ulb@kZQ8{{lqnlW}!|~M{otFNJ{?aD5qHEW@=G*KyukJO$7n}WaPWM)3$Y=hh3+E0-kLMs> zoZh_!ef+vzC`(DsCbV1jw{G#5eOH0a*`^w}T$9k06LiC*HkiDo^KbV9RI=VA zhDNRuv0|z1^uB5XelY@a_maITHw1NjBCcfl+)Tk%tqr>%xU9L8oFSML` zBSgKZy_{FqNB5faV8zu?Ln~|3o1#O)#^9D(J}fg6)dNLHr`eOF+F_4rhU#Ewq@KUW znOGWA!&bs;l!%abA6FI=ChL0S4ZHLOMs;!bXsG_68CMOMTWo0DQC^?frwZwq{i85!4Z9LtfIr^hV&m`TWp_T6O9nj8e&NcpRruq9HF_TeOW_ni_*st=(cl@-- z!*hv9M%H~h0XsSZMc^^Qm>wAK} z!!lumPTo?-ODx~t^oW<#=s2z6n1;vJ5ek z$!67XlofrZUVqrPnqejzQ{yq|7-m7Gh^VrUVD(U)nGMqQF%=&{Dr;z9);YSv_kmeU z8tG*joGa4n&h5FhFbcm9m4j4kXQ7#gnPLl;Nlsv2C>Yh`Ok=+0AN}sss3yyX8Lx%$ z1$xqtftDiK^9yx>BZ23wA4GsfdhL;*{3aD-=tBvW0R`|KUsCDC0+KPtu97i}k)!?E z@RLc&ObwMCgb`8Bgg??vkNW+%`L3(PF>kyW#+T@CkE$BsP;lc$7#Uv*VRX80@u@sM z$O<0{n`r{y)GmWChufg4C!w;ZadH%4xXGd2a#1a&K}$XHXWub$j%CVIYdzt($`#+K zekFZjn43&XzhLxf4-PB!l;dtY@MO@BB@tCU3RP_{$hytsk6lolIaa zy9O#uYR7d0rNxE2`Pfv#eXT^-;C^~uL)5CI{gWd#a|!7>edbia$97pYFIKzs;R{I?tME?3__nhC>!Ql7 zJ9R{EKIGg$&EKORT=aJx@0)#nE@HlLwaSFZ9+cNtWvH*NtZKCi>P@RSd7GqaMyj zdBtQ(N=5MhN`iL%4;-a)U32eeH2!UTPTk>}SLkws?rZ(VHB~NL=rCR~vn+SnF!T+l yrcQnPckZg2C;HzZ8x~JqS6K@RT@KJ45W2zrgpyw9)~`);?fwJ1MR)Dnm;Mh!<5Exn delta 20815 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 wZ>VZvL+SFND9k diff --git a/RenX.Core/RenX_LadderDatabase.cpp b/RenX.Core/RenX_LadderDatabase.cpp index b015ee5..24c689f 100644 --- a/RenX.Core/RenX_LadderDatabase.cpp +++ b/RenX.Core/RenX_LadderDatabase.cpp @@ -80,16 +80,56 @@ void RenX::LadderDatabase::process_data(Jupiter::DataBuffer &buffer, FILE *file, entry->total_captures = buffer.pop(); entry->total_game_time = buffer.pop(); entry->total_games = buffer.pop(); - entry->total_gdi_games = buffer.pop(); - entry->total_nod_games = buffer.pop(); + if (this->read_version == 0) + { + entry->total_gdi_games = buffer.pop(); + entry->total_nod_games = buffer.pop(); + } entry->total_wins = buffer.pop(); - entry->total_gdi_wins = buffer.pop(); - entry->total_nod_wins = buffer.pop(); + if (this->read_version == 0) + { + entry->total_gdi_wins = buffer.pop(); + entry->total_nod_wins = buffer.pop(); + } entry->total_beacon_placements = buffer.pop(); entry->total_beacon_disarms = buffer.pop(); entry->total_proxy_placements = buffer.pop(); entry->total_proxy_disarms = buffer.pop(); + if (this->read_version > 0) + { + entry->total_gdi_games = buffer.pop(); + entry->total_gdi_wins = buffer.pop(); + entry->total_gdi_ties = buffer.pop(); + entry->total_gdi_game_time = buffer.pop(); + entry->total_gdi_score = buffer.pop(); + entry->total_gdi_beacon_placements = buffer.pop(); + entry->total_gdi_beacon_disarms = buffer.pop(); + entry->total_gdi_proxy_placements = buffer.pop(); + entry->total_gdi_proxy_disarms = buffer.pop(); + entry->total_gdi_kills = buffer.pop(); + entry->total_gdi_deaths = buffer.pop(); + entry->total_gdi_vehicle_kills = buffer.pop(); + entry->total_gdi_defence_kills = buffer.pop(); + entry->total_gdi_building_kills = buffer.pop(); + entry->total_gdi_headshots = buffer.pop(); + + entry->total_nod_games = buffer.pop(); + entry->total_nod_wins = buffer.pop(); + entry->total_nod_game_time = buffer.pop(); + entry->total_nod_score = buffer.pop(); + entry->total_nod_beacon_placements = buffer.pop(); + entry->total_nod_beacon_disarms = buffer.pop(); + entry->total_nod_proxy_placements = buffer.pop(); + entry->total_nod_proxy_disarms = buffer.pop(); + entry->total_nod_kills = buffer.pop(); + entry->total_nod_deaths = buffer.pop(); + entry->total_nod_vehicle_kills = buffer.pop(); + entry->total_nod_defence_kills = buffer.pop(); + entry->total_nod_building_kills = buffer.pop(); + entry->total_nod_headshots = buffer.pop(); + } + entry->top_score = buffer.pop(); entry->top_kills = buffer.pop(); entry->most_deaths = buffer.pop(); @@ -136,6 +176,22 @@ void RenX::LadderDatabase::create_header(FILE *file) fputc(RenX::LadderDatabase::write_version, file); } +void RenX::LadderDatabase::process_file_finish(FILE *file) +{ + if (RenX::LadderDatabase::read_version != RenX::LadderDatabase::write_version) + { + puts("Notice: Ladder database is out of date; upgrading..."); + std::chrono::steady_clock::duration write_duration; + std::chrono::steady_clock::time_point start_time = std::chrono::steady_clock::now(); + + RenX::LadderDatabase::write(this->getFilename()); + + write_duration = std::chrono::steady_clock::now() - start_time; + printf("Ladder database upgrade completed in %f seconds", static_cast(write_duration.count()) * (static_cast(std::chrono::steady_clock::duration::period::num) / static_cast(std::chrono::steady_clock::duration::period::den) * static_cast(std::chrono::seconds::duration::period::den / std::chrono::seconds::duration::period::num))); + RenX::LadderDatabase::read_version = RenX::LadderDatabase::write_version; + } +} + RenX::LadderDatabase::Entry *RenX::LadderDatabase::getHead() const { return RenX::LadderDatabase::head; @@ -299,16 +355,43 @@ void RenX::LadderDatabase::write(const char *filename) buffer.push(entry->total_captures); buffer.push(entry->total_game_time); buffer.push(entry->total_games); - buffer.push(entry->total_gdi_games); - buffer.push(entry->total_nod_games); buffer.push(entry->total_wins); - buffer.push(entry->total_gdi_wins); - buffer.push(entry->total_nod_wins); buffer.push(entry->total_beacon_placements); buffer.push(entry->total_beacon_disarms); buffer.push(entry->total_proxy_placements); buffer.push(entry->total_proxy_disarms); + buffer.push(entry->total_gdi_games); + buffer.push(entry->total_gdi_wins); + buffer.push(entry->total_gdi_ties); + buffer.push(entry->total_gdi_game_time); + buffer.push(entry->total_gdi_score); + buffer.push(entry->total_gdi_beacon_placements); + buffer.push(entry->total_gdi_beacon_disarms); + buffer.push(entry->total_gdi_proxy_placements); + buffer.push(entry->total_gdi_proxy_disarms); + buffer.push(entry->total_gdi_kills); + buffer.push(entry->total_gdi_deaths); + buffer.push(entry->total_gdi_vehicle_kills); + buffer.push(entry->total_gdi_defence_kills); + buffer.push(entry->total_gdi_building_kills); + buffer.push(entry->total_gdi_headshots); + + buffer.push(entry->total_nod_games); + buffer.push(entry->total_nod_wins); + buffer.push(entry->total_nod_game_time); + buffer.push(entry->total_nod_score); + buffer.push(entry->total_nod_beacon_placements); + buffer.push(entry->total_nod_beacon_disarms); + buffer.push(entry->total_nod_proxy_placements); + buffer.push(entry->total_nod_proxy_disarms); + buffer.push(entry->total_nod_kills); + buffer.push(entry->total_nod_deaths); + buffer.push(entry->total_nod_vehicle_kills); + buffer.push(entry->total_nod_defence_kills); + buffer.push(entry->total_nod_building_kills); + buffer.push(entry->total_nod_headshots); + buffer.push(entry->top_score); buffer.push(entry->top_kills); buffer.push(entry->most_deaths); @@ -425,6 +508,11 @@ void RenX::LadderDatabase::updateLadder(RenX::Server *server, const RenX::TeamTy entry->total_defence_kills += player->defenceKills; entry->total_captures += player->captures; entry->total_game_time += static_cast(std::chrono::duration_cast(server->getGameTime(player)).count()); + entry->total_beacon_placements += player->beaconPlacements; + entry->total_beacon_disarms += player->beaconDisarms; + entry->total_proxy_placements += player->proxy_placements; + entry->total_proxy_disarms += player->proxy_disarms; + ++entry->total_games; switch (player->team) { @@ -432,21 +520,47 @@ void RenX::LadderDatabase::updateLadder(RenX::Server *server, const RenX::TeamTy ++entry->total_gdi_games; if (player->team == team) ++entry->total_wins, ++entry->total_gdi_wins; + else if (team == RenX::TeamType::None) + ++entry->total_gdi_ties; + + entry->total_gdi_game_time += player->kills; + entry->total_gdi_score += static_cast(player->score); + entry->total_gdi_beacon_placements += player->beaconPlacements; + entry->total_gdi_beacon_disarms += player->beaconDisarms; + entry->total_gdi_proxy_placements += player->proxy_placements; + entry->total_gdi_proxy_disarms += player->proxy_disarms; + entry->total_gdi_kills += player->kills; + entry->total_gdi_deaths += player->deaths; + entry->total_gdi_vehicle_kills += player->vehicleKills; + entry->total_gdi_defence_kills += player->defenceKills; + entry->total_gdi_building_kills += player->buildingKills; + entry->total_gdi_headshots += player->headshots; break; case RenX::TeamType::Nod: ++entry->total_nod_games; if (player->team == team) ++entry->total_wins, ++entry->total_nod_wins; + else if (team == RenX::TeamType::None) + ++entry->total_nod_ties; + + entry->total_nod_game_time += player->kills; + entry->total_nod_score += static_cast(player->score); + entry->total_nod_beacon_placements += player->beaconPlacements; + entry->total_nod_beacon_disarms += player->beaconDisarms; + entry->total_nod_proxy_placements += player->proxy_placements; + entry->total_nod_proxy_disarms += player->proxy_disarms; + entry->total_nod_kills += player->kills; + entry->total_nod_deaths += player->deaths; + entry->total_nod_vehicle_kills += player->vehicleKills; + entry->total_nod_defence_kills += player->defenceKills; + entry->total_nod_building_kills += player->buildingKills; + entry->total_nod_headshots += player->headshots; break; default: if (player->team == team) ++entry->total_wins; break; } - entry->total_beacon_placements += player->beaconPlacements; - entry->total_beacon_disarms += player->beaconDisarms; - entry->total_proxy_placements += player->proxy_placements; - entry->total_proxy_disarms += player->proxy_disarms; auto set_if_greater = [](uint32_t &src, const uint32_t &cmp) { diff --git a/RenX.Core/RenX_LadderDatabase.h b/RenX.Core/RenX_LadderDatabase.h index a712833..c6f3c90 100644 --- a/RenX.Core/RenX_LadderDatabase.h +++ b/RenX.Core/RenX_LadderDatabase.h @@ -63,14 +63,23 @@ namespace RenX */ void create_header(FILE *file) override; + /** + * @brief Called when process_file() is successfully completed. + * + * @param file File being processed + */ + void process_file_finish(FILE *file) override; + public: // LadderDatabase struct RENX_API Entry { size_t rank; - uint64_t steam_id, total_score; - uint32_t total_kills, total_deaths, total_headshot_kills, total_vehicle_kills, total_building_kills, total_defence_kills, total_captures, total_game_time, total_games, total_gdi_games, total_nod_games, total_wins, total_gdi_wins, total_nod_wins, total_beacon_placements, total_beacon_disarms, total_proxy_placements, total_proxy_disarms, // totals (15) - top_score, top_kills, most_deaths, top_headshot_kills, top_vehicle_kills, top_building_kills, top_defence_kills, top_captures, top_game_time, top_beacon_placements, top_beacon_disarms, top_proxy_placements, top_proxy_disarms, // tops (12) + uint64_t steam_id, total_score, total_gdi_score, total_nod_score; // 64-bit fields (4) + uint32_t total_kills, total_deaths, total_headshot_kills, total_vehicle_kills, total_building_kills, total_defence_kills, total_captures, total_game_time, total_games, total_wins, total_beacon_placements, total_beacon_disarms, total_proxy_placements, total_proxy_disarms, // totals (14) + total_gdi_games, total_gdi_wins, total_gdi_ties, total_gdi_game_time, total_gdi_beacon_placements, total_gdi_beacon_disarms, total_gdi_proxy_placements, total_gdi_proxy_disarms, total_gdi_kills, total_gdi_deaths, total_gdi_vehicle_kills, total_gdi_defence_kills, total_gdi_building_kills, total_gdi_headshots, // GDI totals (14) + total_nod_games, total_nod_wins, total_nod_ties, total_nod_game_time, total_nod_beacon_placements, total_nod_beacon_disarms, total_nod_proxy_placements, total_nod_proxy_disarms, total_nod_kills, total_nod_deaths, total_nod_vehicle_kills, total_nod_defence_kills, total_nod_building_kills, total_nod_headshots, // Nod totals (14) + top_score, top_kills, most_deaths, top_headshot_kills, top_vehicle_kills, top_building_kills, top_defence_kills, top_captures, top_game_time, top_beacon_placements, top_beacon_disarms, top_proxy_placements, top_proxy_disarms, // tops (13) most_recent_ip; // other (1) time_t last_game; Jupiter::StringS most_recent_name; @@ -219,7 +228,7 @@ namespace RenX private: /** Database version */ - const uint8_t write_version = 0; + const uint8_t write_version = 1; uint8_t read_version = write_version; bool output_times = false; diff --git a/RenX.Core/RenX_Tags.cpp b/RenX.Core/RenX_Tags.cpp index 9bb528b..9818f66 100644 --- a/RenX.Core/RenX_Tags.cpp +++ b/RenX.Core/RenX_Tags.cpp @@ -111,6 +111,7 @@ TagsImp::TagsImp() this->INTERNAL_KDR_TAG = this->getUniqueInternalTag(); this->INTERNAL_SUICIDES_TAG = this->getUniqueInternalTag(); this->INTERNAL_HEADSHOTS_TAG = this->getUniqueInternalTag(); + this->INTERNAL_HEADSHOT_KILL_RATIO_TAG = this->getUniqueInternalTag(); this->INTERNAL_VEHICLE_KILLS_TAG = this->getUniqueInternalTag(); this->INTERNAL_BUILDING_KILLS_TAG = this->getUniqueInternalTag(); this->INTERNAL_DEFENCE_KILLS_TAG = this->getUniqueInternalTag(); @@ -162,6 +163,7 @@ TagsImp::TagsImp() this->INTERNAL_VICTIM_KDR_TAG = this->getUniqueInternalTag(); this->INTERNAL_VICTIM_SUICIDES_TAG = this->getUniqueInternalTag(); this->INTERNAL_VICTIM_HEADSHOTS_TAG = this->getUniqueInternalTag(); + this->INTERNAL_VICTIM_HEADSHOT_KILL_RATIO_TAG = this->getUniqueInternalTag(); this->INTERNAL_VICTIM_VEHICLE_KILLS_TAG = this->getUniqueInternalTag(); this->INTERNAL_VICTIM_BUILDING_KILLS_TAG = this->getUniqueInternalTag(); this->INTERNAL_VICTIM_DEFENCE_KILLS_TAG = this->getUniqueInternalTag(); @@ -199,6 +201,42 @@ TagsImp::TagsImp() this->INTERNAL_BUILDING_TEAM_SHORT_TAG = this->getUniqueInternalTag(); this->INTERNAL_BUILDING_TEAM_LONG_TAG = this->getUniqueInternalTag(); + /** Ladder tags */ + this->INTERNAL_RANK_TAG = this->getUniqueInternalTag(); + this->INTERNAL_LAST_GAME_TAG = this->getUniqueInternalTag(); + this->INTERNAL_GDI_SCORE_TAG = this->getUniqueInternalTag(); + this->INTERNAL_GDI_SPM_TAG = this->getUniqueInternalTag(); + this->INTERNAL_GDI_GAME_TIME_TAG = this->getUniqueInternalTag(); + this->INTERNAL_GDI_TIES_TAG = this->getUniqueInternalTag(); + this->INTERNAL_GDI_BEACON_PLACEMENTS_TAG = this->getUniqueInternalTag(); + this->INTERNAL_GDI_BEACON_DISARMS_TAG = this->getUniqueInternalTag(); + this->INTERNAL_GDI_PROXY_PLACEMENTS_TAG = this->getUniqueInternalTag(); + this->INTERNAL_GDI_PROXY_DISARMS_TAG = this->getUniqueInternalTag(); + this->INTERNAL_GDI_KILLS_TAG = this->getUniqueInternalTag(); + this->INTERNAL_GDI_DEATHS_TAG = this->getUniqueInternalTag(); + this->INTERNAL_GDI_VEHICLE_KILLS_TAG = this->getUniqueInternalTag(); + this->INTERNAL_GDI_DEFENCE_KILLS_TAG = this->getUniqueInternalTag(); + this->INTERNAL_GDI_BUILDING_KILLS_TAG = this->getUniqueInternalTag(); + this->INTERNAL_GDI_KDR_TAG = this->getUniqueInternalTag(); + this->INTERNAL_GDI_HEADSHOTS_TAG = this->getUniqueInternalTag(); + this->INTERNAL_GDI_HEADSHOT_KILL_RATIO_TAG = this->getUniqueInternalTag(); + this->INTERNAL_NOD_SCORE_TAG = this->getUniqueInternalTag(); + this->INTERNAL_NOD_SPM_TAG = this->getUniqueInternalTag(); + this->INTERNAL_NOD_GAME_TIME_TAG = this->getUniqueInternalTag(); + this->INTERNAL_NOD_TIES_TAG = this->getUniqueInternalTag(); + this->INTERNAL_NOD_BEACON_PLACEMENTS_TAG = this->getUniqueInternalTag(); + this->INTERNAL_NOD_BEACON_DISARMS_TAG = this->getUniqueInternalTag(); + this->INTERNAL_NOD_PROXY_PLACEMENTS_TAG = this->getUniqueInternalTag(); + this->INTERNAL_NOD_PROXY_DISARMS_TAG = this->getUniqueInternalTag(); + this->INTERNAL_NOD_KILLS_TAG = this->getUniqueInternalTag(); + this->INTERNAL_NOD_DEATHS_TAG = this->getUniqueInternalTag(); + this->INTERNAL_NOD_VEHICLE_KILLS_TAG = this->getUniqueInternalTag(); + this->INTERNAL_NOD_DEFENCE_KILLS_TAG = this->getUniqueInternalTag(); + this->INTERNAL_NOD_BUILDING_KILLS_TAG = this->getUniqueInternalTag(); + this->INTERNAL_NOD_KDR_TAG = this->getUniqueInternalTag(); + this->INTERNAL_NOD_HEADSHOTS_TAG = this->getUniqueInternalTag(); + this->INTERNAL_NOD_HEADSHOT_KILL_RATIO_TAG = this->getUniqueInternalTag(); + /** Other tags */ this->INTERNAL_WEAPON_TAG = this->getUniqueInternalTag(); this->INTERNAL_OBJECT_TAG = this->getUniqueInternalTag(); @@ -206,8 +244,6 @@ TagsImp::TagsImp() this->INTERNAL_NEW_NAME_TAG = this->getUniqueInternalTag(); this->INTERNAL_WIN_SCORE_TAG = this->getUniqueInternalTag(); this->INTERNAL_LOSE_SCORE_TAG = this->getUniqueInternalTag(); - this->INTERNAL_LAST_GAME_TAG = this->getUniqueInternalTag(); - this->INTERNAL_RANK_TAG = this->getUniqueInternalTag(); /** External (config) tags */ @@ -254,6 +290,7 @@ TagsImp::TagsImp() this->kdrTag = Jupiter::IRC::Client::Config->get(configSection, "KDRTag"_jrs, "{KDR}"_jrs); this->suicidesTag = Jupiter::IRC::Client::Config->get(configSection, "SuicidesTag"_jrs, "{SUICIDES}"_jrs); this->headshotsTag = Jupiter::IRC::Client::Config->get(configSection, "HeadshotsTag"_jrs, "{HEADSHOTS}"_jrs); + this->headshotKillRatioTag = Jupiter::IRC::Client::Config->get(configSection, "HeadshotKillRatioTag"_jrs, "{HSKR}"_jrs); this->vehicleKillsTag = Jupiter::IRC::Client::Config->get(configSection, "VehicleKillsTag"_jrs, "{VEHICLEKILLS}"_jrs); this->buildingKillsTag = Jupiter::IRC::Client::Config->get(configSection, "BuildingKillsTag"_jrs, "{BUILDINGKILLS}"_jrs); this->defenceKillsTag = Jupiter::IRC::Client::Config->get(configSection, "DefenceKillsTag"_jrs, "{DEFENCEKILLS}"_jrs); @@ -269,8 +306,8 @@ TagsImp::TagsImp() this->GDILossesTag = Jupiter::IRC::Client::Config->get(configSection, "GDILossesTag"_jrs, "{GDILOSSES}"_jrs); this->NodLossesTag = Jupiter::IRC::Client::Config->get(configSection, "NodLossesTag"_jrs, "{NODLOSSES}"_jrs); this->winLossRatioTag = Jupiter::IRC::Client::Config->get(configSection, "WinLossRatioTag"_jrs, "{WLR}"_jrs); - this->GDIWinLossRatioTag = Jupiter::IRC::Client::Config->get(configSection, "GDIWinLossRatioTag"_jrs, "{GWLR}"_jrs); - this->NodWinLossRatioTag = Jupiter::IRC::Client::Config->get(configSection, "NodWinLossRatioTag"_jrs, "{NWLR}"_jrs); + this->GDIWinLossRatioTag = Jupiter::IRC::Client::Config->get(configSection, "GDIWinLossRatioTag"_jrs, "{GDIWLR}"_jrs); + this->NodWinLossRatioTag = Jupiter::IRC::Client::Config->get(configSection, "NodWinLossRatioTag"_jrs, "{NODWLR}"_jrs); this->beaconPlacementsTag = Jupiter::IRC::Client::Config->get(configSection, "BeaconPlacementsTag"_jrs, "{BEACONPLACEMENTS}"_jrs); this->beaconDisarmsTag = Jupiter::IRC::Client::Config->get(configSection, "BeaconDisarmsTag"_jrs, "{BEACONDISARMS}"_jrs); this->proxyPlacementsTag = Jupiter::IRC::Client::Config->get(configSection, "ProxyPlacementsTag"_jrs, "{PROXYPLACEMENTS}"_jrs); @@ -305,6 +342,7 @@ TagsImp::TagsImp() this->victimKDRTag = Jupiter::IRC::Client::Config->get(configSection, "VictimKDRTag"_jrs, "{VKDR}"_jrs); this->victimSuicidesTag = Jupiter::IRC::Client::Config->get(configSection, "VictimSuicidesTag"_jrs, "{VSUICIDES}"_jrs); this->victimHeadshotsTag = Jupiter::IRC::Client::Config->get(configSection, "VictimHeadshotsTag"_jrs, "{VHEADSHOTS}"_jrs); + this->victimHeadshotKillRatioTag = Jupiter::IRC::Client::Config->get(configSection, "VictimHeadshotKillRatioTag"_jrs, "{VHSKR}"_jrs); this->victimVehicleKillsTag = Jupiter::IRC::Client::Config->get(configSection, "VictimVehicleKillsTag"_jrs, "{VVEHICLEKILLS}"_jrs); this->victimBuildingKillsTag = Jupiter::IRC::Client::Config->get(configSection, "VictimBuildingKillsTag"_jrs, "{VBUILDINGKILLS}"_jrs); this->victimDefenceKillsTag = Jupiter::IRC::Client::Config->get(configSection, "VictimDefenceKillsTag"_jrs, "{VDEFENCEKILLS}"_jrs); @@ -320,8 +358,8 @@ TagsImp::TagsImp() this->victimGDILossesTag = Jupiter::IRC::Client::Config->get(configSection, "VictimGDILossesTag"_jrs, "{VGDILOSSES}"_jrs); this->victimNodLossesTag = Jupiter::IRC::Client::Config->get(configSection, "VictimNodLossesTag"_jrs, "{VNODLOSSES}"_jrs); this->victimWinLossRatioTag = Jupiter::IRC::Client::Config->get(configSection, "WinLossRatioTag"_jrs, "{WLR}"_jrs); - this->victimGDIWinLossRatioTag = Jupiter::IRC::Client::Config->get(configSection, "GDIWinLossRatioTag"_jrs, "{VGWLR}"_jrs); - this->victimNodWinLossRatioTag = Jupiter::IRC::Client::Config->get(configSection, "NodWinLossRatioTag"_jrs, "{VNWLR}"_jrs); + this->victimGDIWinLossRatioTag = Jupiter::IRC::Client::Config->get(configSection, "GDIWinLossRatioTag"_jrs, "{VGDIWLR}"_jrs); + this->victimNodWinLossRatioTag = Jupiter::IRC::Client::Config->get(configSection, "NodWinLossRatioTag"_jrs, "{VNODWLR}"_jrs); this->victimBeaconPlacementsTag = Jupiter::IRC::Client::Config->get(configSection, "VictimBeaconPlacementsTag"_jrs, "{VBEACONPLACEMENTS}"_jrs); this->victimBeaconDisarmsTag = Jupiter::IRC::Client::Config->get(configSection, "VictimBeaconDisarmsTag"_jrs, "{VBEACONDISARMS}"_jrs); this->victimProxyPlacementsTag = Jupiter::IRC::Client::Config->get(configSection, "VictimProxyPlacementsTag"_jrs, "{VPROXYPLACEMENTS}"_jrs); @@ -342,6 +380,42 @@ TagsImp::TagsImp() this->buildingTeamShortTag = Jupiter::IRC::Client::Config->get(configSection, "BuildingShortTeamTag"_jrs, "{BTEAMS}"_jrs); this->buildingTeamLongTag = Jupiter::IRC::Client::Config->get(configSection, "BuildingLongTeamTag"_jrs, "{BTEAML}"_jrs); + /** Ladder tags */ + this->rankTag = Jupiter::IRC::Client::Config->get(configSection, "RankTag"_jrs, "{RANK}"_jrs); + this->lastGameTag = Jupiter::IRC::Client::Config->get(configSection, "LastGameTag"_jrs, "{LASTGAME}"_jrs); + this->GDIScoreTag = Jupiter::IRC::Client::Config->get(configSection, "GDIScoreTag"_jrs, "{GDISCORE}"_jrs); + this->GDISPMTag = Jupiter::IRC::Client::Config->get(configSection, "GDISPMTag"_jrs, "{GDISPM}"_jrs); + this->GDIGameTimeTag = Jupiter::IRC::Client::Config->get(configSection, "GDIGameTimeTag"_jrs, "{GDIGAMETIME}"_jrs); + this->GDITiesTag = Jupiter::IRC::Client::Config->get(configSection, "GDITiesTag"_jrs, "{GDITIES}"_jrs); + this->GDIBeaconPlacementsTag = Jupiter::IRC::Client::Config->get(configSection, "GDIBeaconPlacementsTag"_jrs, "{GDIBEACONPLACEMENTS}"_jrs); + this->GDIBeaconDisarmsTag = Jupiter::IRC::Client::Config->get(configSection, "GDIBeaconDisarmsTag"_jrs, "{GDIBEACONDISARMS}"_jrs); + this->GDIProxyPlacementsTag = Jupiter::IRC::Client::Config->get(configSection, "GDIProxyPlacementsTag"_jrs, "{GDIPROXYPLACEMENTS}"_jrs); + this->GDIProxyDisarmsTag = Jupiter::IRC::Client::Config->get(configSection, "GDIProxyDisarmsTag"_jrs, "{GDIPROXYDISARMS}"_jrs); + this->GDIKillsTag = Jupiter::IRC::Client::Config->get(configSection, "GDIKillsTag"_jrs, "{GDIKILLS}"_jrs); + this->GDIDeathsTag = Jupiter::IRC::Client::Config->get(configSection, "GDIDeathsTag"_jrs, "{GDIDEATHS}"_jrs); + this->GDIVehicleKillsTag = Jupiter::IRC::Client::Config->get(configSection, "GDIVehicleKillsTag"_jrs, "{GDIVEHICLEKILLS}"_jrs); + this->GDIDefenceKillsTag = Jupiter::IRC::Client::Config->get(configSection, "GDIDefenceKillsTag"_jrs, "{GDIDEFENCEKILLS}"_jrs); + this->GDIBuildingKillsTag = Jupiter::IRC::Client::Config->get(configSection, "GDIBuildingKillsTag"_jrs, "{GDIBUILDINGKILLS}"_jrs); + this->GDIKDRTag = Jupiter::IRC::Client::Config->get(configSection, "GDIKDRTag"_jrs, "{GDIKDR}"_jrs); + this->GDIHeadshotsTag = Jupiter::IRC::Client::Config->get(configSection, "GDIHeadshotsTag"_jrs, "{GDIHEADSHOTS}"_jrs); + this->GDIHeadshotKillRatioTag = Jupiter::IRC::Client::Config->get(configSection, "GDIHeadshotKillRatioTag"_jrs, "{GDIHSKR}"_jrs); + this->NodScoreTag = Jupiter::IRC::Client::Config->get(configSection, "NodScoreTag"_jrs, "{NODSCORE}"_jrs); + this->NodSPMTag = Jupiter::IRC::Client::Config->get(configSection, "NodSPMTag"_jrs, "{NODSPM}"_jrs); + this->NodGameTimeTag = Jupiter::IRC::Client::Config->get(configSection, "NodGameTimeTag"_jrs, "{NODGAMETIME}"_jrs); + this->NodTiesTag = Jupiter::IRC::Client::Config->get(configSection, "NodTiesTag"_jrs, "{NODTIES}"_jrs); + this->NodBeaconPlacementsTag = Jupiter::IRC::Client::Config->get(configSection, "NodBeaconPlacementsTag"_jrs, "{NODBEACONPLACEMENTS}"_jrs); + this->NodBeaconDisarmsTag = Jupiter::IRC::Client::Config->get(configSection, "NodBeaconDisarmsTag"_jrs, "{NODBEACONDISARMS}"_jrs); + this->NodProxyPlacementsTag = Jupiter::IRC::Client::Config->get(configSection, "NodProxyPlacementsTag"_jrs, "{NODPROXYPLACEMENTS}"_jrs); + this->NodProxyDisarmsTag = Jupiter::IRC::Client::Config->get(configSection, "NodProxyDisarmsTag"_jrs, "{NODPROXYDISARMS}"_jrs); + this->NodKillsTag = Jupiter::IRC::Client::Config->get(configSection, "NodKillsTag"_jrs, "{NODKILLS}"_jrs); + this->NodDeathsTag = Jupiter::IRC::Client::Config->get(configSection, "NodDeathsTag"_jrs, "{NODDEATHS}"_jrs); + this->NodVehicleKillsTag = Jupiter::IRC::Client::Config->get(configSection, "NodVehicleKillsTag"_jrs, "{NODVEHICLEKILLS}"_jrs); + this->NodDefenceKillsTag = Jupiter::IRC::Client::Config->get(configSection, "NodDefenceKillsTag"_jrs, "{NODDEFENCEKILLS}"_jrs); + this->NodBuildingKillsTag = Jupiter::IRC::Client::Config->get(configSection, "NodBuildingKillsTag"_jrs, "{NODBUILDINGKILLS}"_jrs); + this->NodKDRTag = Jupiter::IRC::Client::Config->get(configSection, "NodKDRTag"_jrs, "{NODKDR}"_jrs); + this->NodHeadshotsTag = Jupiter::IRC::Client::Config->get(configSection, "NodHeadshotsTag"_jrs, "{NODHEADSHOTS}"_jrs); + this->NodHeadshotKillRatioTag = Jupiter::IRC::Client::Config->get(configSection, "NodHeadshotKillRatioTag"_jrs, "{NODHSKR}"_jrs); + /** Other tags */ this->weaponTag = Jupiter::IRC::Client::Config->get(configSection, "WeaponTag"_jrs, "{WEAPON}"_jrs); this->objectTag = Jupiter::IRC::Client::Config->get(configSection, "ObjectTag"_jrs, "{OBJECT}"_jrs); @@ -349,8 +423,6 @@ TagsImp::TagsImp() this->newNameTag = Jupiter::IRC::Client::Config->get(configSection, "NewNameTag"_jrs, "{NNAME}"_jrs); this->winScoreTag = Jupiter::IRC::Client::Config->get(configSection, "WinScoreTag"_jrs, "{WINSCORE}"_jrs); this->loseScoreTag = Jupiter::IRC::Client::Config->get(configSection, "LoseScoreTag"_jrs, "{LOSESCORE}"_jrs); - this->lastGameTag = Jupiter::IRC::Client::Config->get(configSection, "LastGameTag"_jrs, "{LASTGAME}"_jrs); - this->rankTag = Jupiter::IRC::Client::Config->get(configSection, "RankTag"_jrs, "{RANK}"_jrs); } Jupiter::StringS TagsImp::get_building_health_bar(const RenX::BuildingInfo *building) @@ -447,6 +519,7 @@ void TagsImp::processTags(Jupiter::StringType &msg, const RenX::Server *server, PROCESS_TAG(this->INTERNAL_KDR_TAG, Jupiter::StringS::Format("%.2f", get_ratio(static_cast(player->kills), static_cast(player->deaths)))); PROCESS_TAG(this->INTERNAL_SUICIDES_TAG, Jupiter::StringS::Format("%u", player->suicides)); PROCESS_TAG(this->INTERNAL_HEADSHOTS_TAG, Jupiter::StringS::Format("%u", player->headshots)); + PROCESS_TAG(this->INTERNAL_HEADSHOT_KILL_RATIO_TAG, Jupiter::StringS::Format("%.2f", get_ratio(player->headshots, player->kills))); PROCESS_TAG(this->INTERNAL_VEHICLE_KILLS_TAG, Jupiter::StringS::Format("%u", player->vehicleKills)); PROCESS_TAG(this->INTERNAL_BUILDING_KILLS_TAG, Jupiter::StringS::Format("%u", player->buildingKills)); PROCESS_TAG(this->INTERNAL_DEFENCE_KILLS_TAG, Jupiter::StringS::Format("%u", player->defenceKills)); @@ -484,6 +557,7 @@ void TagsImp::processTags(Jupiter::StringType &msg, const RenX::Server *server, PROCESS_TAG(this->INTERNAL_VICTIM_KDR_TAG, Jupiter::StringS::Format("%.2f", get_ratio(static_cast(victim->kills), static_cast(victim->deaths)))); PROCESS_TAG(this->INTERNAL_VICTIM_SUICIDES_TAG, Jupiter::StringS::Format("%u", victim->suicides)); PROCESS_TAG(this->INTERNAL_VICTIM_HEADSHOTS_TAG, Jupiter::StringS::Format("%u", victim->headshots)); + PROCESS_TAG(this->INTERNAL_VICTIM_HEADSHOT_KILL_RATIO_TAG, Jupiter::StringS::Format("%.2f", get_ratio(victim->headshots, victim->kills))); PROCESS_TAG(this->INTERNAL_VICTIM_VEHICLE_KILLS_TAG, Jupiter::StringS::Format("%u", victim->vehicleKills)); PROCESS_TAG(this->INTERNAL_VICTIM_BUILDING_KILLS_TAG, Jupiter::StringS::Format("%u", victim->buildingKills)); PROCESS_TAG(this->INTERNAL_VICTIM_DEFENCE_KILLS_TAG, Jupiter::StringS::Format("%u", victim->defenceKills)); @@ -521,8 +595,8 @@ void TagsImp::processTags(Jupiter::StringType &msg, const RenX::LadderDatabase:: PROCESS_TAG(this->INTERNAL_NAME_TAG, entry.most_recent_name); PROCESS_TAG(this->INTERNAL_STEAM_TAG, Jupiter::StringS::Format("%llu", entry.steam_id)); - PROCESS_TAG(this->INTERNAL_LAST_GAME_TAG, Jupiter::StringS::Format("XX Xuary 20XX at 00:00:00")); // TODO: format this! PROCESS_TAG(this->INTERNAL_RANK_TAG, Jupiter::StringS::Format("%u", entry.rank)); + PROCESS_TAG(this->INTERNAL_LAST_GAME_TAG, Jupiter::StringS::Format("XX Xuary 20XX at 00:00:00")); // TODO: format this! /** Totals */ PROCESS_TAG(this->INTERNAL_SCORE_TAG, Jupiter::StringS::Format("%llu", entry.total_score)); @@ -531,30 +605,68 @@ void TagsImp::processTags(Jupiter::StringType &msg, const RenX::LadderDatabase:: PROCESS_TAG(this->INTERNAL_KDR_TAG, Jupiter::StringS::Format("%.2f", get_ratio(static_cast(entry.total_kills), static_cast(entry.total_deaths)))); PROCESS_TAG(this->INTERNAL_SCORE_PER_MINUTE_TAG, Jupiter::StringS::Format("%.2f", get_ratio(static_cast(entry.total_score), static_cast(entry.total_game_time) / 60.0))); PROCESS_TAG(this->INTERNAL_HEADSHOTS_TAG, Jupiter::StringS::Format("%u", entry.total_headshot_kills)); + PROCESS_TAG(this->INTERNAL_HEADSHOT_KILL_RATIO_TAG, Jupiter::StringS::Format("%.2f", get_ratio(entry.total_headshot_kills, entry.total_kills))); PROCESS_TAG(this->INTERNAL_VEHICLE_KILLS_TAG, Jupiter::StringS::Format("%u", entry.total_vehicle_kills)); PROCESS_TAG(this->INTERNAL_BUILDING_KILLS_TAG, Jupiter::StringS::Format("%u", entry.total_building_kills)); PROCESS_TAG(this->INTERNAL_DEFENCE_KILLS_TAG, Jupiter::StringS::Format("%u", entry.total_defence_kills)); PROCESS_TAG(this->INTERNAL_CAPTURES_TAG, Jupiter::StringS::Format("%u", entry.total_captures)); PROCESS_TAG(this->INTERNAL_GAME_TIME_TAG, Jupiter::StringS::Format("%u", entry.total_game_time)); PROCESS_TAG(this->INTERNAL_GAMES_TAG, Jupiter::StringS::Format("%u", entry.total_games)); - PROCESS_TAG(this->INTERNAL_GDI_GAMES_TAG, Jupiter::StringS::Format("%u", entry.total_gdi_games)); - PROCESS_TAG(this->INTERNAL_NOD_GAMES_TAG, Jupiter::StringS::Format("%u", entry.total_nod_games)); PROCESS_TAG(this->INTERNAL_WINS_TAG, Jupiter::StringS::Format("%u", entry.total_wins)); - PROCESS_TAG(this->INTERNAL_GDI_WINS_TAG, Jupiter::StringS::Format("%u", entry.total_gdi_wins)); - PROCESS_TAG(this->INTERNAL_NOD_WINS_TAG, Jupiter::StringS::Format("%u", entry.total_nod_wins)); PROCESS_TAG(this->INTERNAL_TIES_TAG, Jupiter::StringS::Format("%u", total_tied_games)); PROCESS_TAG(this->INTERNAL_LOSSES_TAG, Jupiter::StringS::Format("%u", entry.total_games - total_tied_games - entry.total_wins)); - PROCESS_TAG(this->INTERNAL_GDI_LOSSES_TAG, Jupiter::StringS::Format("%u", entry.total_gdi_games - entry.total_gdi_wins)); - PROCESS_TAG(this->INTERNAL_NOD_LOSSES_TAG, Jupiter::StringS::Format("%u", entry.total_nod_games - entry.total_nod_wins)); - PROCESS_TAG(this->INTERNAL_WIN_LOSS_RATIO_TAG, Jupiter::StringS::Format("%.2f", get_ratio(static_cast(entry.total_wins), static_cast(entry.total_games - entry.total_wins)))); - PROCESS_TAG(this->INTERNAL_GDI_WIN_LOSS_RATIO_TAG, Jupiter::StringS::Format("%.2f", get_ratio(static_cast(entry.total_gdi_wins), static_cast(entry.total_gdi_games - entry.total_gdi_wins)))); - PROCESS_TAG(this->INTERNAL_NOD_WIN_LOSS_RATIO_TAG, Jupiter::StringS::Format("%.2f", get_ratio(static_cast(entry.total_nod_wins), static_cast(entry.total_nod_games - entry.total_nod_wins)))); PROCESS_TAG(this->INTERNAL_BEACON_PLACEMENTS_TAG, Jupiter::StringS::Format("%u", entry.total_beacon_placements)); PROCESS_TAG(this->INTERNAL_BEACON_DISARMS_TAG, Jupiter::StringS::Format("%u", entry.total_beacon_disarms)); PROCESS_TAG(this->INTERNAL_PROXY_PLACEMENTS_TAG, Jupiter::StringS::Format("%u", entry.total_proxy_placements)); PROCESS_TAG(this->INTERNAL_PROXY_DISARMS_TAG, Jupiter::StringS::Format("%u", entry.total_proxy_disarms)); + /** GDI Totals */ + PROCESS_TAG(this->INTERNAL_GDI_GAMES_TAG, Jupiter::StringS::Format("%u", entry.total_gdi_games)); + PROCESS_TAG(this->INTERNAL_GDI_WINS_TAG, Jupiter::StringS::Format("%u", entry.total_gdi_wins)); + PROCESS_TAG(this->INTERNAL_GDI_TIES_TAG, Jupiter::StringS::Format("%u", entry.total_gdi_ties)); + PROCESS_TAG(this->INTERNAL_GDI_LOSSES_TAG, Jupiter::StringS::Format("%u", entry.total_gdi_games - entry.total_gdi_wins - entry.total_gdi_ties)); + PROCESS_TAG(this->INTERNAL_GDI_WIN_LOSS_RATIO_TAG, Jupiter::StringS::Format("%.2f", get_ratio(static_cast(entry.total_gdi_wins), static_cast(entry.total_gdi_games - entry.total_gdi_wins - entry.total_gdi_ties)))); + PROCESS_TAG(this->INTERNAL_GDI_SCORE_TAG, Jupiter::StringS::Format("%llu", entry.total_gdi_score)); + PROCESS_TAG(this->INTERNAL_GDI_SPM_TAG, Jupiter::StringS::Format("%u", get_ratio(static_cast(entry.total_gdi_score), static_cast(entry.total_gdi_game_time)))); + PROCESS_TAG(this->INTERNAL_GDI_GAME_TIME_TAG, Jupiter::StringS::Format("%u", entry.total_gdi_game_time)); + PROCESS_TAG(this->INTERNAL_GDI_TIES_TAG, Jupiter::StringS::Format("%u", entry.total_gdi_ties)); + PROCESS_TAG(this->INTERNAL_GDI_BEACON_PLACEMENTS_TAG, Jupiter::StringS::Format("%u", entry.total_gdi_beacon_placements)); + PROCESS_TAG(this->INTERNAL_GDI_BEACON_DISARMS_TAG, Jupiter::StringS::Format("%u", entry.total_gdi_beacon_disarms)); + PROCESS_TAG(this->INTERNAL_GDI_PROXY_PLACEMENTS_TAG, Jupiter::StringS::Format("%u", entry.total_gdi_proxy_placements)); + PROCESS_TAG(this->INTERNAL_GDI_PROXY_DISARMS_TAG, Jupiter::StringS::Format("%u", entry.total_gdi_proxy_disarms)); + PROCESS_TAG(this->INTERNAL_GDI_KILLS_TAG, Jupiter::StringS::Format("%u", entry.total_gdi_kills)); + PROCESS_TAG(this->INTERNAL_GDI_DEATHS_TAG, Jupiter::StringS::Format("%u", entry.total_gdi_deaths)); + PROCESS_TAG(this->INTERNAL_GDI_VEHICLE_KILLS_TAG, Jupiter::StringS::Format("%u", entry.total_gdi_vehicle_kills)); + PROCESS_TAG(this->INTERNAL_GDI_DEFENCE_KILLS_TAG, Jupiter::StringS::Format("%u", entry.total_gdi_defence_kills)); + PROCESS_TAG(this->INTERNAL_GDI_BUILDING_KILLS_TAG, Jupiter::StringS::Format("%u", entry.total_gdi_building_kills)); + PROCESS_TAG(this->INTERNAL_GDI_KDR_TAG, Jupiter::StringS::Format("%.2f", get_ratio(static_cast(entry.total_gdi_kills), static_cast(entry.total_gdi_deaths)))); + PROCESS_TAG(this->INTERNAL_GDI_HEADSHOTS_TAG, Jupiter::StringS::Format("%u", entry.total_gdi_headshots)); + PROCESS_TAG(this->INTERNAL_GDI_HEADSHOT_KILL_RATIO_TAG, Jupiter::StringS::Format("%.2f", get_ratio(static_cast(entry.total_gdi_headshots), static_cast(entry.total_gdi_kills)))); + + /** Nod Totals */ + PROCESS_TAG(this->INTERNAL_NOD_GAMES_TAG, Jupiter::StringS::Format("%u", entry.total_nod_games)); + PROCESS_TAG(this->INTERNAL_NOD_WINS_TAG, Jupiter::StringS::Format("%u", entry.total_nod_wins)); + PROCESS_TAG(this->INTERNAL_NOD_TIES_TAG, Jupiter::StringS::Format("%u", entry.total_nod_ties)); + PROCESS_TAG(this->INTERNAL_NOD_LOSSES_TAG, Jupiter::StringS::Format("%u", entry.total_nod_games - entry.total_nod_wins - entry.total_nod_ties)); + PROCESS_TAG(this->INTERNAL_NOD_WIN_LOSS_RATIO_TAG, Jupiter::StringS::Format("%.2f", get_ratio(static_cast(entry.total_nod_wins), static_cast(entry.total_nod_games - entry.total_nod_wins - entry.total_nod_ties)))); + PROCESS_TAG(this->INTERNAL_NOD_SCORE_TAG, Jupiter::StringS::Format("%llu", entry.total_nod_score)); + PROCESS_TAG(this->INTERNAL_NOD_SPM_TAG, Jupiter::StringS::Format("%u", get_ratio(static_cast(entry.total_nod_score), static_cast(entry.total_nod_game_time)))); + PROCESS_TAG(this->INTERNAL_NOD_GAME_TIME_TAG, Jupiter::StringS::Format("%u", entry.total_nod_game_time)); + PROCESS_TAG(this->INTERNAL_NOD_TIES_TAG, Jupiter::StringS::Format("%u", entry.total_nod_ties)); + PROCESS_TAG(this->INTERNAL_NOD_BEACON_PLACEMENTS_TAG, Jupiter::StringS::Format("%u", entry.total_nod_beacon_placements)); + PROCESS_TAG(this->INTERNAL_NOD_BEACON_DISARMS_TAG, Jupiter::StringS::Format("%u", entry.total_nod_beacon_disarms)); + PROCESS_TAG(this->INTERNAL_NOD_PROXY_PLACEMENTS_TAG, Jupiter::StringS::Format("%u", entry.total_nod_proxy_placements)); + PROCESS_TAG(this->INTERNAL_NOD_PROXY_DISARMS_TAG, Jupiter::StringS::Format("%u", entry.total_nod_proxy_disarms)); + PROCESS_TAG(this->INTERNAL_NOD_KILLS_TAG, Jupiter::StringS::Format("%u", entry.total_nod_kills)); + PROCESS_TAG(this->INTERNAL_NOD_DEATHS_TAG, Jupiter::StringS::Format("%u", entry.total_nod_deaths)); + PROCESS_TAG(this->INTERNAL_NOD_VEHICLE_KILLS_TAG, Jupiter::StringS::Format("%u", entry.total_nod_vehicle_kills)); + PROCESS_TAG(this->INTERNAL_NOD_DEFENCE_KILLS_TAG, Jupiter::StringS::Format("%u", entry.total_nod_defence_kills)); + PROCESS_TAG(this->INTERNAL_NOD_BUILDING_KILLS_TAG, Jupiter::StringS::Format("%u", entry.total_nod_building_kills)); + PROCESS_TAG(this->INTERNAL_NOD_KDR_TAG, Jupiter::StringS::Format("%.2f", get_ratio(static_cast(entry.total_nod_kills), static_cast(entry.total_nod_deaths)))); + PROCESS_TAG(this->INTERNAL_NOD_HEADSHOTS_TAG, Jupiter::StringS::Format("%u", entry.total_nod_headshots)); + PROCESS_TAG(this->INTERNAL_NOD_HEADSHOT_KILL_RATIO_TAG, Jupiter::StringS::Format("%.2f", get_ratio(static_cast(entry.total_nod_headshots), static_cast(entry.total_nod_kills)))); + /** Tops */ PROCESS_TAG(this->INTERNAL_VICTIM_SCORE_TAG, Jupiter::StringS::Format("%u", entry.top_score)); PROCESS_TAG(this->INTERNAL_VICTIM_KILLS_TAG, Jupiter::StringS::Format("%u", entry.top_kills)); @@ -616,6 +728,7 @@ void TagsImp::sanitizeTags(Jupiter::StringType &fmt) fmt.replace(this->kdrTag, this->INTERNAL_KDR_TAG); fmt.replace(this->suicidesTag, this->INTERNAL_SUICIDES_TAG); fmt.replace(this->headshotsTag, this->INTERNAL_HEADSHOTS_TAG); + fmt.replace(this->headshotKillRatioTag, this->INTERNAL_HEADSHOT_KILL_RATIO_TAG); fmt.replace(this->vehicleKillsTag, this->INTERNAL_VEHICLE_KILLS_TAG); fmt.replace(this->buildingKillsTag, this->INTERNAL_BUILDING_KILLS_TAG); fmt.replace(this->defenceKillsTag, this->INTERNAL_DEFENCE_KILLS_TAG); @@ -667,6 +780,7 @@ void TagsImp::sanitizeTags(Jupiter::StringType &fmt) fmt.replace(this->victimKDRTag, this->INTERNAL_VICTIM_KDR_TAG); fmt.replace(this->victimSuicidesTag, this->INTERNAL_VICTIM_SUICIDES_TAG); fmt.replace(this->victimHeadshotsTag, this->INTERNAL_VICTIM_HEADSHOTS_TAG); + fmt.replace(this->victimHeadshotKillRatioTag, this->INTERNAL_VICTIM_HEADSHOT_KILL_RATIO_TAG); fmt.replace(this->victimVehicleKillsTag, this->INTERNAL_VICTIM_VEHICLE_KILLS_TAG); fmt.replace(this->victimBuildingKillsTag, this->INTERNAL_VICTIM_BUILDING_KILLS_TAG); fmt.replace(this->victimDefenceKillsTag, this->INTERNAL_VICTIM_DEFENCE_KILLS_TAG); @@ -704,6 +818,42 @@ void TagsImp::sanitizeTags(Jupiter::StringType &fmt) fmt.replace(this->buildingTeamShortTag, this->INTERNAL_BUILDING_TEAM_SHORT_TAG); fmt.replace(this->buildingTeamLongTag, this->INTERNAL_BUILDING_TEAM_LONG_TAG); + /** Ladder tags */ + fmt.replace(this->rankTag, this->INTERNAL_RANK_TAG); + fmt.replace(this->lastGameTag, this->INTERNAL_LAST_GAME_TAG); + fmt.replace(this->GDIScoreTag, this->INTERNAL_GDI_SCORE_TAG); + fmt.replace(this->GDISPMTag, this->INTERNAL_GDI_SPM_TAG); + fmt.replace(this->GDIGameTimeTag, this->INTERNAL_GDI_GAME_TIME_TAG); + fmt.replace(this->GDITiesTag, this->INTERNAL_GDI_TIES_TAG); + fmt.replace(this->GDIBeaconPlacementsTag, this->INTERNAL_GDI_BEACON_PLACEMENTS_TAG); + fmt.replace(this->GDIBeaconDisarmsTag, this->INTERNAL_GDI_BEACON_DISARMS_TAG); + fmt.replace(this->GDIProxyPlacementsTag, this->INTERNAL_GDI_PROXY_PLACEMENTS_TAG); + fmt.replace(this->GDIProxyDisarmsTag, this->INTERNAL_GDI_PROXY_DISARMS_TAG); + fmt.replace(this->GDIKillsTag, this->INTERNAL_GDI_KILLS_TAG); + fmt.replace(this->GDIDeathsTag, this->INTERNAL_GDI_DEATHS_TAG); + fmt.replace(this->GDIVehicleKillsTag, this->INTERNAL_GDI_VEHICLE_KILLS_TAG); + fmt.replace(this->GDIDefenceKillsTag, this->INTERNAL_GDI_DEFENCE_KILLS_TAG); + fmt.replace(this->GDIBuildingKillsTag, this->INTERNAL_GDI_BUILDING_KILLS_TAG); + fmt.replace(this->GDIKDRTag, this->INTERNAL_GDI_KDR_TAG); + fmt.replace(this->GDIHeadshotsTag, this->INTERNAL_GDI_HEADSHOTS_TAG); + fmt.replace(this->GDIHeadshotKillRatioTag, this->INTERNAL_GDI_HEADSHOT_KILL_RATIO_TAG); + fmt.replace(this->NodScoreTag, this->INTERNAL_NOD_SCORE_TAG); + fmt.replace(this->NodSPMTag, this->INTERNAL_NOD_SPM_TAG); + fmt.replace(this->NodGameTimeTag, this->INTERNAL_NOD_GAME_TIME_TAG); + fmt.replace(this->NodTiesTag, this->INTERNAL_NOD_TIES_TAG); + fmt.replace(this->NodBeaconPlacementsTag, this->INTERNAL_NOD_BEACON_PLACEMENTS_TAG); + fmt.replace(this->NodBeaconDisarmsTag, this->INTERNAL_NOD_BEACON_DISARMS_TAG); + fmt.replace(this->NodProxyPlacementsTag, this->INTERNAL_NOD_PROXY_PLACEMENTS_TAG); + fmt.replace(this->NodProxyDisarmsTag, this->INTERNAL_NOD_PROXY_DISARMS_TAG); + fmt.replace(this->NodKillsTag, this->INTERNAL_NOD_KILLS_TAG); + fmt.replace(this->NodDeathsTag, this->INTERNAL_NOD_DEATHS_TAG); + fmt.replace(this->NodVehicleKillsTag, this->INTERNAL_NOD_VEHICLE_KILLS_TAG); + fmt.replace(this->NodDefenceKillsTag, this->INTERNAL_NOD_DEFENCE_KILLS_TAG); + fmt.replace(this->NodBuildingKillsTag, this->INTERNAL_NOD_BUILDING_KILLS_TAG); + fmt.replace(this->NodKDRTag, this->INTERNAL_NOD_KDR_TAG); + fmt.replace(this->NodHeadshotsTag, this->INTERNAL_NOD_HEADSHOTS_TAG); + fmt.replace(this->NodHeadshotKillRatioTag, this->INTERNAL_NOD_HEADSHOT_KILL_RATIO_TAG); + /** Other tags */ fmt.replace(this->weaponTag, this->INTERNAL_WEAPON_TAG); fmt.replace(this->objectTag, this->INTERNAL_OBJECT_TAG); @@ -711,8 +861,6 @@ void TagsImp::sanitizeTags(Jupiter::StringType &fmt) fmt.replace(this->newNameTag, this->INTERNAL_NEW_NAME_TAG); fmt.replace(this->winScoreTag, this->INTERNAL_WIN_SCORE_TAG); fmt.replace(this->loseScoreTag, this->INTERNAL_LOSE_SCORE_TAG); - fmt.replace(this->lastGameTag, this->INTERNAL_LAST_GAME_TAG); - fmt.replace(this->rankTag, this->INTERNAL_RANK_TAG); Jupiter::ArrayList &xPlugins = *RenX::getCore()->getPlugins(); for (size_t i = 0; i < xPlugins.size(); i++) diff --git a/RenX.Core/RenX_Tags.h b/RenX.Core/RenX_Tags.h index 2f0b7d0..590c4cf 100644 --- a/RenX.Core/RenX_Tags.h +++ b/RenX.Core/RenX_Tags.h @@ -96,6 +96,7 @@ namespace RenX Jupiter::StringS INTERNAL_KDR_TAG; Jupiter::StringS INTERNAL_SUICIDES_TAG; Jupiter::StringS INTERNAL_HEADSHOTS_TAG; + Jupiter::StringS INTERNAL_HEADSHOT_KILL_RATIO_TAG; Jupiter::StringS INTERNAL_VEHICLE_KILLS_TAG; Jupiter::StringS INTERNAL_BUILDING_KILLS_TAG; Jupiter::StringS INTERNAL_DEFENCE_KILLS_TAG; @@ -147,6 +148,7 @@ namespace RenX Jupiter::StringS INTERNAL_VICTIM_KDR_TAG; Jupiter::StringS INTERNAL_VICTIM_SUICIDES_TAG; Jupiter::StringS INTERNAL_VICTIM_HEADSHOTS_TAG; + Jupiter::StringS INTERNAL_VICTIM_HEADSHOT_KILL_RATIO_TAG; Jupiter::StringS INTERNAL_VICTIM_VEHICLE_KILLS_TAG; Jupiter::StringS INTERNAL_VICTIM_BUILDING_KILLS_TAG; Jupiter::StringS INTERNAL_VICTIM_DEFENCE_KILLS_TAG; @@ -184,6 +186,42 @@ namespace RenX Jupiter::StringS INTERNAL_BUILDING_TEAM_SHORT_TAG; Jupiter::StringS INTERNAL_BUILDING_TEAM_LONG_TAG; + /** Ladder tags */ + Jupiter::StringS INTERNAL_RANK_TAG; + Jupiter::StringS INTERNAL_LAST_GAME_TAG; + Jupiter::StringS INTERNAL_GDI_SCORE_TAG; + Jupiter::StringS INTERNAL_GDI_SPM_TAG; + Jupiter::StringS INTERNAL_GDI_GAME_TIME_TAG; + Jupiter::StringS INTERNAL_GDI_TIES_TAG; + Jupiter::StringS INTERNAL_GDI_BEACON_PLACEMENTS_TAG; + Jupiter::StringS INTERNAL_GDI_BEACON_DISARMS_TAG; + Jupiter::StringS INTERNAL_GDI_PROXY_PLACEMENTS_TAG; + Jupiter::StringS INTERNAL_GDI_PROXY_DISARMS_TAG; + Jupiter::StringS INTERNAL_GDI_KILLS_TAG; + Jupiter::StringS INTERNAL_GDI_DEATHS_TAG; + Jupiter::StringS INTERNAL_GDI_VEHICLE_KILLS_TAG; + Jupiter::StringS INTERNAL_GDI_DEFENCE_KILLS_TAG; + Jupiter::StringS INTERNAL_GDI_BUILDING_KILLS_TAG; + Jupiter::StringS INTERNAL_GDI_KDR_TAG; + Jupiter::StringS INTERNAL_GDI_HEADSHOTS_TAG; + Jupiter::StringS INTERNAL_GDI_HEADSHOT_KILL_RATIO_TAG; + Jupiter::StringS INTERNAL_NOD_SCORE_TAG; + Jupiter::StringS INTERNAL_NOD_SPM_TAG; + Jupiter::StringS INTERNAL_NOD_GAME_TIME_TAG; + Jupiter::StringS INTERNAL_NOD_TIES_TAG; + Jupiter::StringS INTERNAL_NOD_BEACON_PLACEMENTS_TAG; + Jupiter::StringS INTERNAL_NOD_BEACON_DISARMS_TAG; + Jupiter::StringS INTERNAL_NOD_PROXY_PLACEMENTS_TAG; + Jupiter::StringS INTERNAL_NOD_PROXY_DISARMS_TAG; + Jupiter::StringS INTERNAL_NOD_KILLS_TAG; + Jupiter::StringS INTERNAL_NOD_DEATHS_TAG; + Jupiter::StringS INTERNAL_NOD_VEHICLE_KILLS_TAG; + Jupiter::StringS INTERNAL_NOD_DEFENCE_KILLS_TAG; + Jupiter::StringS INTERNAL_NOD_BUILDING_KILLS_TAG; + Jupiter::StringS INTERNAL_NOD_KDR_TAG; + Jupiter::StringS INTERNAL_NOD_HEADSHOTS_TAG; + Jupiter::StringS INTERNAL_NOD_HEADSHOT_KILL_RATIO_TAG; + /** Other tags */ Jupiter::StringS INTERNAL_WEAPON_TAG; Jupiter::StringS INTERNAL_OBJECT_TAG; @@ -191,8 +229,6 @@ namespace RenX Jupiter::StringS INTERNAL_NEW_NAME_TAG; Jupiter::StringS INTERNAL_WIN_SCORE_TAG; Jupiter::StringS INTERNAL_LOSE_SCORE_TAG; - Jupiter::StringS INTERNAL_LAST_GAME_TAG; - Jupiter::StringS INTERNAL_RANK_TAG; /** External message tags */ @@ -239,6 +275,7 @@ namespace RenX Jupiter::StringS kdrTag; Jupiter::StringS suicidesTag; Jupiter::StringS headshotsTag; + Jupiter::StringS headshotKillRatioTag; Jupiter::StringS vehicleKillsTag; Jupiter::StringS buildingKillsTag; Jupiter::StringS defenceKillsTag; @@ -290,6 +327,7 @@ namespace RenX Jupiter::StringS victimKDRTag; Jupiter::StringS victimSuicidesTag; Jupiter::StringS victimHeadshotsTag; + Jupiter::StringS victimHeadshotKillRatioTag; Jupiter::StringS victimVehicleKillsTag; Jupiter::StringS victimBuildingKillsTag; Jupiter::StringS victimDefenceKillsTag; @@ -327,6 +365,42 @@ namespace RenX Jupiter::StringS buildingTeamShortTag; Jupiter::StringS buildingTeamLongTag; + /** Ladder tags */ + Jupiter::StringS rankTag; + Jupiter::StringS lastGameTag; + Jupiter::StringS GDIScoreTag; + Jupiter::StringS GDISPMTag; + Jupiter::StringS GDIGameTimeTag; + Jupiter::StringS GDITiesTag; + Jupiter::StringS GDIBeaconPlacementsTag; + Jupiter::StringS GDIBeaconDisarmsTag; + Jupiter::StringS GDIProxyPlacementsTag; + Jupiter::StringS GDIProxyDisarmsTag; + Jupiter::StringS GDIKillsTag; + Jupiter::StringS GDIDeathsTag; + Jupiter::StringS GDIVehicleKillsTag; + Jupiter::StringS GDIDefenceKillsTag; + Jupiter::StringS GDIBuildingKillsTag; + Jupiter::StringS GDIKDRTag; + Jupiter::StringS GDIHeadshotsTag; + Jupiter::StringS GDIHeadshotKillRatioTag; + Jupiter::StringS NodScoreTag; + Jupiter::StringS NodSPMTag; + Jupiter::StringS NodGameTimeTag; + Jupiter::StringS NodTiesTag; + Jupiter::StringS NodBeaconPlacementsTag; + Jupiter::StringS NodBeaconDisarmsTag; + Jupiter::StringS NodProxyPlacementsTag; + Jupiter::StringS NodProxyDisarmsTag; + Jupiter::StringS NodKillsTag; + Jupiter::StringS NodDeathsTag; + Jupiter::StringS NodVehicleKillsTag; + Jupiter::StringS NodDefenceKillsTag; + Jupiter::StringS NodBuildingKillsTag; + Jupiter::StringS NodKDRTag; + Jupiter::StringS NodHeadshotsTag; + Jupiter::StringS NodHeadshotKillRatioTag; + /** Other tags */ Jupiter::StringS weaponTag; Jupiter::StringS objectTag; @@ -334,8 +408,6 @@ namespace RenX Jupiter::StringS newNameTag; Jupiter::StringS winScoreTag; Jupiter::StringS loseScoreTag; - Jupiter::StringS lastGameTag; - Jupiter::StringS rankTag; }; RENX_API extern Tags *tags; diff --git a/RenX.Ladder.Web/RenX_Ladder_Web.cpp b/RenX.Ladder.Web/RenX_Ladder_Web.cpp index f72f78e..0609b4f 100644 --- a/RenX.Ladder.Web/RenX_Ladder_Web.cpp +++ b/RenX.Ladder.Web/RenX_Ladder_Web.cpp @@ -78,7 +78,7 @@ int RenX_Ladder_WebPlugin::OnRehash() RenX_Ladder_WebPlugin::web_ladder_table_footer_filename = Jupiter::IRC::Client::Config->get(RenX_Ladder_WebPlugin::name, "LadderTableFooterFilename"_jrs, "RenX.Ladder.Web.Ladder.Table.Footer.html"_jrs); RenX_Ladder_WebPlugin::entries_per_page = Jupiter::IRC::Client::Config->getInt(RenX_Ladder_WebPlugin::name, "EntriesPerPage"_jrs, 50); - RenX_Ladder_WebPlugin::entry_table_row = Jupiter::IRC::Client::Config->get(RenX_Ladder_WebPlugin::name, "EntryTableRow"_jrs, "{RANK}{NAME}{SCORE}{SPM}{KILLS}{DEATHS}{KDR}{NODGAMES}{NODWINS}{NODLOSSES}{NWLR}{GDIGAMES}{GDIWINS}{GDILOSSES}{GWLR}"_jrs); + RenX_Ladder_WebPlugin::entry_table_row = Jupiter::IRC::Client::Config->get(RenX_Ladder_WebPlugin::name, "EntryTableRow"_jrs, R"html({RANK}{NAME}{SCORE}{SPM}{GAMES}{WINS}{LOSSES}{WLR}{KILLS}{DEATHS}{KDR})html"_jrs); RenX::sanitizeTags(RenX_Ladder_WebPlugin::entry_table_row); RenX_Ladder_WebPlugin::header.erase();