From d4f52701869994f8984abccab8a4b4e43b068c7d Mon Sep 17 00:00:00 2001 From: Marvin Winkens Date: Tue, 25 Feb 2025 10:04:48 +0100 Subject: [PATCH] add speedlimit tile --- data/editor/speedup.png | Bin 17091 -> 25874 bytes src/game/client/components/chat.cpp | 42 ++++++++++++------ src/game/client/components/mapimages.cpp | 2 +- .../client/prediction/entities/character.cpp | 9 ++++ src/game/editor/explanations.cpp | 4 +- src/game/editor/mapitems/layer_speedup.cpp | 6 +++ src/game/editor/mapitems/layer_switch.cpp | 7 +++ src/game/editor/mapitems/layer_tele.cpp | 6 +++ src/game/editor/mapitems/layer_tune.cpp | 6 +++ src/game/mapitems.cpp | 2 +- src/game/mapitems.h | 1 + src/game/server/entities/character.cpp | 9 ++++ 12 files changed, 77 insertions(+), 17 deletions(-) diff --git a/data/editor/speedup.png b/data/editor/speedup.png index 0ba0d71aa5a4a6a386a724bcca8a33379718791f..429565c76d4686ac7a668d0577ef63cf90dee2fc 100644 GIT binary patch literal 25874 zcmeGDhgVbC_XdpPU>O_CjBOBsaYPUh8L3jE<2V`+P^w6Yihz_5=_Mq=ag?#5p-GKO zlNx%YMr8mgAxH}lAoS1!2_%HH_gv=lTfcwdUGMt3mW!L*bI(0zpIx5)?42jqtS;~0 zb99fCl+=Fsl|O8xq_%_0?NZ`0PyUxz7zSXD z#!u-Z+rSs0XLiSlFF;R8!K1O~p^Io`yi~36Zs@Ba_;-s9e&2mBCAAn@v-^$~{lQ4M zMol4U2Xfy>!C7fAVqocew|6Pff~3}@x86`(Xt(f}lT_E>*w!1O&E}7;Iby4*a=o`8 z-6_%VmgQ2d0x#kB`np(md>3v0-&617l~q-o-c02v6D$HP@#|`;((3Ko(*N7tUpDw- z@l!9Ab!uJwt{BQ)i{Jj+Ua2-^FkQ53Gg57r0M0&-e|8f`;+MzAZ9lIEEq<)1uy-?V zZ%@ROWI&l#C3fqLEI!_voxbp0(bj{cd>fn5MOKwEZfJVq#i15Q$74#R>Bc*1)&G0? z1BN0Ai%UzsD^YIO*i#3a-oGu5eKlGiy%^p3x%dhssqprE7Y@!IFRSY9FB*O|C4a~x ziB;nExfs56w?OUWw3-;{D@Iwf`N}X0_T@u6yj1v}3#)JX8Pw%ynJ@pFM#CGylf3Ic zprssvy7VA5E~;{Zqm*5D;THYsg9v){!;%6#c$?Iy`cRlaaRxCF8Cd4)~jUQ>F5Sz7B09gRdBL3 zA%m;s*7L{vQ3_nO$2VwtsU6q@=fEHjA*c&Qp&}J~}HE!VX zmfT05bM+($^N1jFRvlXMrk_x&zDMHS)+3^aN+igpN==2&I6{s{UKBI>8ak&c2Z1MU z*U1Rni{EpzPK*%-Z*mj+sVyOAeClC-m$!D?e~+<(a>AcfBQjAzSB><=7I=cgF)BO| z(*}RAW3FOcsYGGRH(~k|g%aIqZwUo{#=NCQqFimF@LAO3dUV4HKMsFs$uJN~SG|O6 ztn0{9j~Hdqk|ME)b4i_=2)@cwN}pogjCJG=7w1Vz{_}O1P-ml1wl)68A~MP8m|sLY5uo}Mef<-PyXH1|FCa;|&cCrf&H(s|OBA6%{=@+B^KvSo|E!t;F6oaB>?Zn#$%m^FOC`OV7^AxSj?wXjNoTYdP*eW4tq zBKO;^^XAz$TrGdA6732{@_Hlrem*IeBkLn+&&n|!|sXtc5M zQ@QmR()W;XewhpJLjd!;V)zObB%JyNI`Nj?KNAjL)juHufeyOt@?G=9Y-K z>tfZMy3dTil@Y{Kzv(C}h&3Jx%AIjqh=#fku9=dR!&~l9KDVhHu)R{`yze}=^P}SS@KTh*2Y7sFX1gYSOUDoCVCP-oW}MQ@64*ZFh+45+BP}_ z$>lAf*06Q&A%d2-s9v{K6U;alK8-l?7jEFvmQUeFHmxSZ&-j@()K5gYx4d%{eLiz< zrE?iPT4KBZip{1E-qvPx8a8+3dy~;ky1%4kK?lMVSMVj*Tg$ur(w@`V!}ZKuMOrK;Qr3?YifcGLt0kJte*Pe#;{a1(Qk%V@ja`p5VTe z>u&CCgS!y=03byh4Lr;l6bNLYp+`bBIMylT^4d?KziheN!^+#L_J5WvTR`F(KwkN- z&hRhENGfz*CC;z64;X<@gso5X*V||1KjS3-J(sAwEfOFr+}6HpHQ~|AyTyVdkT7qN zRCZsxy26nBcgqwW-ML*Nii76p(z^0pJQ%07Wv+}_7F_Bx41E88|Nc(`|0jX}lfeH; z;QwtBFs4OsCAGJ9)f85gqoo#=q4?8<_+I=D0i_wy;`1xAq72BnFD`GFoL2@Hw|FWW zyKch4)u(0i64gSKt-NHJHR^W;K(1azmKM18q{u}rJ41BOP z;r!-dVf(@JFunU*NK9%#ypy#k1BM%q#^Z)?USZn?E+pc@oqmGC$-w?MeX_y1Ldh1~ znT;_&374KlEkZ#~N)!#@vyuXxH((eN#OE4d0JDd zOL7BREVv6T<$tNZRF~`k6t6=g`Z>}grMrIt*R}5wAHq^-EsDtoT*F`B+KbbBHseTX8is#QE&DTbJv1-0ClMGMs(;P&;U*W3jYF(NMV37^mDABTHQzEcfkC z)$y`gu30Gdr!QM3>w6I}q4=pc?k`(;4ZQje0z%>Y&J?|Zm8c?g?9XR^)$!`=cz@|x zActbW%d0P^ni->6^Igp5-67SE11XXQ*IgBw;~pr#(n`_Hb5l>`GV+L+C?LTAz$ z8Ulv_OX(@V(gL}IUS1RbK9PfAqXgBv6vN-HREK6I&M8qIzt+*d-{>pXF#C9)-<;Uc zIR~e!rLg+MuUM&XPWZTaE@J6Zk9Oc_f}D7k5k_xL+}u5QjyvEt6l9~n^lcTh4;gv7 z(LwmpQ>mt(UP9eAXc8Q*zoch4i89Letf!pt3Q2u4I~Pf;5HrtgodGqKIJqTG&ANQB3!OalQf92_Qu^gAUR26@UD z&Axpur=z0d*>O(`2q$e3$Rt_U+om~IiGbma7`Qh-Z(SL0)bZ}l%17f^XoiL#>s^du zo0C_1f>XKY^e1WAj!`r#T~5dI?#9Zv;aD{L3LDIrKUB+Z(=aw|+_vl3tJXMGRk+#4 zXIanX;c75MT03fE<;!M*8`BEgx!PDADthaia(3#pPi^>5m~{e>=(bJ^7*E}ipGN%&SIybRm?wn$=Noht5K z$F3J3kRf;Oh{ltqvPl?|?Bfd5YX3HtCqrUF^8BTq8;`T%WF2T%@|hx~yc7oSY*;m) zCu~>=s)2~J`O%UDT1%a#JTJp0!Q_MP*axcTzb6=-V>E}E^?;TfkG0!s`{gn$(T8v` z$emS%-qt_VnJo|a4KSnqe149zL|e9*#g4u*O`Rbj7+vRdCMA*YpBH64}Rx#M<=q5T=3oV3*>J zfzj8O6|3!+id?F-8T`(${7%?f*TrPxF#lL8P5yw&)vx;vhOfOj{{|eO8Miccx*Z`7 zBq2MJbyN|8AzF=PN3fnx?+2IAL64=~(dC^+8eSO@o>nHM$L=w(f~EA$jX^55$~N$Q zb+w^}L*ZAJM9kvNW1Z(!r}&IoGkJM>M)?Umqk{HtA%XvGk>53Kzuuq09?`WnI$obF z!|DF<2uW4S%~0$c5fVwm5r&ZQk9%|HzFK>%6lm0L7nw46l_XsLid%^9vL)W{7}_rb zHYc$|;IMQ}=PgI(I@-zDejivF=B7glRMu`+HhOc-5;iwCt!VQL3!GkC>-Bjv`IhvwBe4=2!;<1}E$fr9)C||oBGc(w z?~L%@DMqfyV&9I33HG8j5%`^KVW|oy( z7u;jj{L1|)7|b$4FIDP0;2tZBcv9zp>TmYWbZ1-GsweoUNa0_aS*06=q;g5MX#aNZ zay@VK7*4o~sd1#`aa9RXfyE7*^SZjaYXerOV$@QQWP~Ad9XC~{M^VwEwjuT4m=OFn z$H+QXbAT$7Z|GQQ#b*`!F}?1Y346RVHaZpO?VQOBR@V48GIi#0vl(rv;4`uKN}gR? z&g1L$yrVUt0RoPn-_N!o7-;R-&0=K#MJO>7fZ zefEsx?FhxjXoDhy%y|vR;;TVH5k_k%dcJ||R#o1)O@g1`q|_yNOw+R?Oa)eWi$0QQ z(Ee*mYHE4lbXz_LGKd66x50uj*qrNkw|u>%fNwE1T&n1)sb@tn(;fS`&$Jrev}+OF zhzM^B(MH|4h#-TGhE!Pk*4pg1N1vy?V1mKnz;?|?A!h8?v1@Oneg*;K z_78Pnc`3Ct$4x#Jm!Tw@y}U#~07Z7eiPr6>u>v|{=ARQUXG`l_lyD{njHn>Di0K4w zB+WI<^{Bjj!B9cv=?NxG5>Z^oZZlzjJ)y_qETM3<)=y$b;|uiY6Zr+jZ7^XYOc_w# zu4LLmaqSs!gg6l8+y<6&&DQh2)b9Ynk+nXMd&H_*Kb1SIrG}g<^}}-mDKR1^{g-L| zg2)~E`kf#0VYl3a{xpfaIG;G0_CV8`ImlzA1NXLQ=XtAr$S;p2WTh($PH*Juo)$~A zOQz@YeW4k~>mQp0SyyXKTB%1R-lm##F`4R~TlB7cvOe-=mEYX4PbT7xNxg@Xn;}CL z>9CnM?t9u@Li+3t=d$A1;FLU8Cz=d-!$EtcH)5lvPNbXRHX4=A_<_=nz@_=QTpTk4 zeMZ)7F&Dk^zchG*im@M8Lj$9~OBD8?e_2Y>@?JD^oI8DuF#-6F8$%5zoA4)We zKfa&gRr?K=rA5x?Eir+ra8?>+na%R3!a+A@m@kHAFcNHwpUR4}Y6BjTmN$$O(Qwni z?Y5$D0{Ycd{i6J3H}q11EOzDLBMj0)y_Y>-ii>-3Lbf=CYj$_(fE>52tkC%FBxRel zepS};U`!d!eVQ2+(Y(voYDB4|^yCS}db9m|iJdb)qS}MVXv^E58uD&4^7VI;%e43J zE%uSrWw)38ecYFDia?Zi>Kj#*m9SE%HQpNoU(l5ZMtS&T073 z2j2AOj|t+n+-m+zDrc>y??k6--#in%sLYd+@>~gKhFf>U_2q57y6KQ(mYupsEB@po zBD;3w%U+$psjvA}=pn(_3pG}I!7f5VF|O`}VuKOb{h6e}T45Ucv;;n%D1M8%ixJ(% zrD(37D41879>cAT5ISFZEyLAXKjrWT(W^Xmx3RdQMiyq?U74VZO_^HSVLmM;sC~%#99KhRwcFHZLn-g1HQw1i;A?Nv@$z{`KqqQS3NEVg43UG2O6kyAX!@ zOKdJ!A|b}Z>VY~!GBX$rchA+<)YPn=!dncn%5Q!C>&xb)&yoYyCf~dh|9G7=iVf(C z=a~{VE}&Nk%9+b`CHIX)1-nGV6kCZrOJF0Y*wk-ykeoK0IAHH#uw-Aqc59$~T8(F^ ziXbG4u(_hmXiH5w4DY1eTK9=T8-w@xqg_c!9-My~%LCR5{eF(P@1_)TPhVd#Z8t+x zD|NsHR#s!x&~E<%iHcxy}o?dN=x#uYW~Aw)r|1>qHuuP z^m4PU(~b1thVZV+4iM^$F<4sdsQo}^oVA%#NO5UtX};g}>SEjRxQRbLgXr#)m}(T_ z(^m;hc51nnRqT^%r#>A=5Z)aR3k3QWwmD22gTb3$DmZT_^wDU{oK*k$wfc%3l7#ky z%hk+`LIl}teSO_@bOD0w+(^zlLdT3LuONlp&~kz?yHm#Q-O*kEHeQGIXb!toVxu(LBWDOPUY&GSF9+eaRhK-90;XCX#kz5d86bl#`8~2gmB_W zt%yE!Zu#FYYHM(ITZe34vB4dme(NZ&oqm35g~m~H3UXa_IidGPv#q@EyAnr#DPg)x za64ff*wT`}-_P^~1KE9%At9hzq5s_EV}9q`8K!Z+#M-R9gwiJP*N`R!0D|~DtViFR z(PJGH6eL&^1xz-t-w?;!TICthsu~(>=%=ElsgtoVH~ZqH%1G0MR5MKEZJheU@hr~O z2gTDv`adpGsK96XjFua~PF#N3k!BcF)k?meXJ_u}>Ixib0-2vmZXJ(N8XawhoB*;O z+SntVUF!8`xdUuFUeN}yV(nC3+O=?G>}B$GPKJC-#tnPyiiSpH2sLC^T7R`9Q)Vs% z7gPW76ugPPQ=M2}@}Zt$iME5;(&;;^^mM@S-AW>HxKa>yv(cTX4P6>41nEV4k`}ct zf>Q>3)9D*sXS4aQF3PACI?j!-uwnMe)9p!)2^vFJOFp=K3;gSSpkTQcWnbM_;OLlO z3;>C5qQ;QaZ)z-qk|;j=v}=uSfg`aK3c<>)(@BWYN#3{g_l|3o-WFAUFJz;}q?ay; zgnUjdk_iEHv>&Sd)p)()1y<2JDuwzf(aXn;F%W(w7cGPF$LbqApSOoq^}e{m>43o- z-=j{#^^bJ8{aliF@*%=C;kMS9&aR}4j<+-i&#&bQ?biCsdU>~`KfRP93!i@Kq{Y+; z?P4(t^5F0Q(Q;dLdD}+`px~`EVXOZhs4b$Uo|I~QyuU!512Bkvf<|PE2!GNdzl{O{ zspGVYWlC?seyL}Pdnyt%ZXOPxBT3Ul$tJO22;L?ySodf>e_eEQE0$I8)c>HykWvdhsPLzLXQ;1)jqNLOFqp)!Pl;f0v5^lFETbO!rzB_XDT2{_E!?eyir zl{GC6o31q<0&`2pTA{ytJG=hy1zBkRxOn3_Wixe8KTkFi>ET8&GFZqFy6G<(7tC*t z&CHWI22H+F+oaw~h8)mR2kWuKyu3V5!DRCb3;Y*LZlwEYT}1kP`u#7vA1xKS)z{2N zxx2fM|AYBfBQ9oU;Kcm=pi4TkLv4pDS3&SU!VMYz7{H$~ASVOgUG1Yx&dxqr;84`Y zo^FTY;{mI4$4^{#K)I3bkAF#Fczq*Z#}5bhST5=O;FI8+%4K*0^M1r5PrfvcTxU6v zS5ln}=3EDL%Q!(Yz}H?N7PoadI@}#=UWall-;$B?T?1 zgcD!BTo;1D`SXr=zdX9?f^79~7yHkgNz?mnCBfqnPpdCU(r@wbv3;L2T9{;%L3~SD z&X}V>`J`0U(CoL&f}U;XpN(FBkb<}@^zK_(SL5ZSAXktAR})>NI&{fO4}(U&<76W+(-N&5G#7*HkRGT+S>iT*h$f z70A%;l11EhAf)7=PD53QgR(j|{`Vrt=iqJa2WnpC69Ss$s)g)!<8jG(G{XGA(w?eqWoxIXu;1;)LqH?~93!k=2=rF5pycJ%ww(3Thz$+e}J z$OBu%B=8RXQdcufs(rEoL3jsY#|((3$mQD=4&Y|+07|ZJWbli(t@h^G?)Ca5IHXz5 zYYiZ!8gW+m?(^U3lQf+j%3p9gjfwLvw7`)aY@m(pEimzFz7eo?$@Ow88#MV5AR<(P zn4OeluZ+QlTAW9&$?I(|#OIIFR^x_m#6T7ZA~>?CxC3hd6m|Ky7y%v4G9T%Yf& z2C0K_y1aqE3kZ$&_6-X^J!lAD?~?Vh5PhxNtlFEe zhW$lOl2Oyg^B8NMsrz>BMCzYbOTAViwy{p|G_E3%INFN)x_8<@VX<_U(4)+K61rjL*}E{UhC#aT1j z(eJ%CE-h>VZ{uk1zqvM7ukKh;Og^=G|KA@k_nvn2Mf`PB{o#C%HLQLm`Ke1l(;=si z_ivLttYD%wvvm(jie5E1RwGN1HGc1zk8gbt4|8&IT+mCE_5QWpkKwG=#LXY)D2(NQ z5E#9OZf6&DMw@PITxN)1RQ_tQbk3@ zU7%Lp-rlX!vL;=M=fX65LYKt?78OwB&I1lKNA97b1#7&cTSRsb|E9&Enw<<}>yzSs zA_5W8Fq`lf-0;RSrR*O)-~KF!FLf;L&?F7x0g@jq_W~@V4>a?UhLuOdpu{jz#mKog zchS+((vqKx+suuU2pC#**v~tT*qPc|SXhYH5t5Js@k{*|>FJgyYLw)*6d5N@k`pf0 zrbG;hU4G)Dz!%&xGmUi`8CY)>qY)7NoO|uky>A@B>=x6xY6*CR3Xo4fV|YL z4s?OOaJ0ifPtOBL#|h*XSkVH42~cS9(Mrk05%P^g!*<1`5;2cVcy^}dLyvYeP*TY1 z?N6+_KBV8AuJK=_ITSDKi!NT+biR4B4EV<{$=@Zk##99YCl)rY@|Q)@8OqZ`8f-wk zLiLCOxjF)fn{s0aPsT+_TnS zR$I*OOx`IAcDzt*^J}@mC;#m$L6*NOMD)>Imi9T!=43}(mN;2d5od6Mh?F+ z0NlblCL^5yXsoM~u1CDix0ibxvWZ6P5s=#l0({)CapQ4ao$f_9mun$J+RX(hG2HYB z^NhVj3yaKok;(X$M|nUr@c25Usx$Ryo=p0$ZzeRt*h@CLrlv;7P9k@Fd9*i3BI0>{ zdwWrM|5YwBS03-9(yPoik5&_xp|o#U=KK57iFhaVSIS3{NTE3xfit) z>>_=O;eqlSnGHqkbO>SB$FFBc}D)BeJ z$h(5yhgqh{)v#YKeH(Ed{SIu2FgL|xoS%FiqP|No*Z)L#_s zn(-~_tuYt6#J2w=HH$k94UWcs+6Vp&^vO|n)!3Fn^KEKc0L)$rT}o|k`!6Z;(p8#$ z2~}CUP)^@TiDIEkP)mISO;Kx<$v+7W6pK^ljiONw zg*UF>@CQ}5WRr-%=8~0ZO zygo#~3aOS|rBeYBw|WHk+Wn=W%KrWPo$A5^W;)ZI!>LthyZ$AL>A>0lLZj*%T!HcC zY$gZz1sGHnfH<_St}bj5@Qp{@!f!8soO~HIz8CQ|FE=CQtb6m_-VfK8JU}6bkylRy zwr)+9)T%%HEwW2TypAUZzpQmP9< z9Hqa4%GOegKQIY6Y^N!2m`io8^7Doj7ZkKZO9X)P1au2MhH%OWyek5du*l zjfu42Zg?`F0df~|Ga`Ki)qp9iFhIx}{{x-;+Qmev#TyW=ATju0bBUQRjnqK_OD(}X zVzucA{lGQ~g|ZZas+r4y_!WC(f_XOJ4I5Szq3=DOLdfLn^~(zOdiD}_yB1aA!Rl);*_WV)_59*s1;bKpEs^|3?Z2TG$Bm6es=NTj8&uWycJYND;R zsUAqEG#Sm)F4alMXh_SmXUjBca)o=;dlvNN)Ng z!9Dxrw6oR@k}E5rDcUuNbvB7uP=EGVuLlT9`~KLcvU9+_X&5US1>gJg<*~tHMNq|8 zQy{PRJ<9qR_8C$U5S9&&xCVc#9p)T7Bw4luNAT%!=LW9c06Y%RK^DlzATP8)Bxh`s z-U)qlL|{TxtkM8$*&IL7kzrc9h6bClGUHE0tz{}%f7Y>wZjXmYMTa$P-LFfNOG11YN(Ss3UfSFj)4fD)cL7r+5+C6S<_ zUA;M9U@;D)m(6gLD63T#6c?W%jYj%9!Jv6)Ex^u3zp_)xZp#O8Z z1UDlwR3in6%hY@U@r*`h7;7~9+^%Ey&s!PIW%&U{yP7-X+rD$7VAnLUj%^P1m#&;_ ziVmI2I0vdZZS&|pd&h)s6VR)XeL;|7Epilmy=-Q)Cl$oKT7e&+#Z<}) zDK&ZtvZ1-TaD3Fn0m2oVW4|Ck%?pl)YUA1GAWk0G-%TUMvv>Y53R`wDG6O}t?jmQ> zJ_RFPcwmb{*xm6jk32k%MXh{><3YLvNT-V6Wspq5ZK8f6_c=IcgVQ6{b8mvvyJ3zV zd$22Uf($mm2jahBYzTb?NH1rh&>*l%VTb+(iiHm0JvSW z6ncUsbpWimW)a zkUyQ2v>cPbihS76hZRmLB`HAN1`xEwZ+T?U zkkbw1mziNL4Vrfsr49+-;T%ux&Q%dK9fKI${F7_ z|1I;f)1YsLyzaegT+oRE40r0Uy=T7a(Oi0#4@K*Z1hgnDeSuKZT~+wPN zSkqCfBW#(oP%xD@vgXiy3t-#cC<6aGRQo|D6>f163K_9n? zS6aZI-kf@5)u0MwrD~nf$wdKxtfc@^JlPe`4r{7ATiyqip~Q@C$(%K=4KSW=4z%Cj zU31_<&;<}5v2tLoP=ifpx-kC9^u+S<{tI(s5bAQA?GynT^R<1T#?b`@2_=m>lk?*xd`$NS|SxE>EcR5qid$QU(ByqfLMi2D(j`xkORKfZD` z$Pz{!FcDtKKvL2BGd>G9eSi>7%YSd6t2+fKq^}^iNV)Xv@HFUhI+KpNckk;u4FR<| zkq+vEexl%|Aw9?`KMMm(nKB^rE%6hzeBWjQ@L4mUl?r+iLRVm>f#TsU5Wog)I!2IV zE`e@>a=+7Zg8(#ufF>++k28Sz#sS^n^bxUo@PNQc@cQ}RP|^~K#(#(Ds0oeO>>=Ql zfdQ$DGL)rv$#ekCjf3`hK-KE>{tg0YZGp(2?2phrKoRv25#+kHZVRXbqiyFZlrn*4 zEc-;Bk4V6yR?^()K_awn zhD5|D2R7HOylsK-RI&gC4oMbE?3$W)2!A)zBBsGOWL)|-a0Af15@Nw;dWCQyDDK9V z`Ixad97UZC#-}wUx#snRt=7Y_ zdh#v~Lg8lIYtwuX`BV2)&+&6)cHOF7FYFkX_9?q=Ne}hXNvfK13`*^HYA%&7C`S|K z{b&W}{)n7P$Z-)5=Xap|7^I6ec2j?i)Z{pals?Zx=`u^3D16cT8JPuftEQ1E+|ApM zBCVwtawBOZ(!q1!&xFBx>r&x6c}I^+LC0HQF67QgoYx<@r+w9h6mF6K|*o%>}+3Cd^CEBYJO!}d4KJ!&+o3!dEZzjGg_#QM&5J{-S5ck z%glKnTx3vC)Zyv+^jSZ%zjCS|)?ljOqAxzn6)g)!)*IQ!&*QU#HRGm)-uojwoqQW~ z3wv&|()&c^5wttTkNsT|G(7bZix(VY`lnLq{W)C9f?1Ha#UOv(dG+YP_8+9A^n)1@ zeAW}!D|r7TfBtgsw8Gk?t8ZY(*Ocz)g(Ck{TD%s6qz*5mt0eH}2CU=;Yx5gF67>$U z>vzcq(K$$I@^M#F4>C;FSa zSM7I&cA7~K!Gc^}ljKkb1HZ)>d3|k8P)H;wAAwbCOT@t~(j9T6;!auatV{j^*|est z5aT<9jB67vXS&)ryS{!r^E=ke+g`kojPo1YT#yZEt4g)==xSCVUl)JkP&}5fWBi#k zeph}6QA_4`+G0{Nk#zSyudUK;QV+v>(41E4%k;Bx_G`pEOQAW%>QSQVPlk1%IzN7E z5=TxXBt}g(Bp7;z+nZ@;MW*v8R=5w;*s!A3C-l&pzGzqwvyJQ&BeBqEFjIZ9rI8OR zj@Nxx!V4`L3@@*Q4Vo3A0wZGEqE?#|{rZTnkR)$-clYh#1~~TYTlE&#k(A4b(^aA) zm+d{0wmni-NIF}A3govu;}fe|W)2yKvVOMlz_;=eZ^}5vF001VKCc+@A^&R;Zg!(aEEqqO-7tKvmArNp zYdEP?yGw?i`ReXc+%EK*Rh}EX49A#q?mHwG<{J=rNAOxRZ`nbJp*OVF43TrFFX5Xq z_k0_-rJjTb<;ALiNmP(6yB(ERkdg3Z_d)FMFxzg3*TpYVrYrUixw zWRl~C*~6O>0}m)<>jy7LK29o?iDuc`XwQ$}4T*MlCD$JXV>q`Lf0V|XsyccS6`XB! z-XgEvB&%0@MP8~JE_{XDJkl7cY&iMhY1BmbM9++Am=+cH*|)W^{25b5$@TQ)KigWn zcB$*|*6*b0y!5f8L|5es*9&a&Emn_*dT@t-G$o%VeTjQLv#0D^KR2CS?#JB^XHZsWz55B zzBv3a@9HJDn<*xeKTBm>_F2Ci%oOGvbA3J4e}~~`cE`hM=w0ez?eMs}0j}L%lWew? z!1dDTjq9&db5$m}T6d`MCLTKqvzFSQ~a zH>;JvpNes|E&nq`PD|NZtMH2JMeTL|oq=kCdRC6Dty2T9<4UJle$koC%MMeC%>Kz8 zT$Do}l;HWTj1qLD`lQ=;r4S@=B*YfXWQtXtQs;-R-v23Qg8h zm9Kg`?{ka;N=x|v>jm&-$2t3e|4*e^h!@TY?j)y77;7<}VK&s?tQqE4OE|1m^p#@k z3yQ-=4J{6WSgj&+um^UU8Cjd~vBE+;X)%p-=^ZeHw-A3URC>yL0>zeF_2tvizvu6& zP_V`om+AhN$_c!5_>j7e&-s8c)4<%{J+-bl35^Nf^7AGpWc3!}Y8HlJdb7OILDOTE zfGt@vWv6PnC1W#(cJ?2VKO`~bOy!j6!ZvAE)nm`?vrF1Wn{X}Ik0<+3ohN$@R3xmh zrjy^1Ok5KtW3~Dx`wY~z@3i!n2~|ub++DAN+={P+kh3-^efxd6)|cmN6M57}xHC$7 zGBAO*W>qMQj1;HjR8~>j3toszlEURA9=*bgPR2?4Lr=oV+aCEDzI|odl9;Q63v)J9 z#YT-puuO7H7_~W$MI51JTz>}dIa4F(-8S=Gn#j>!qakh!%zH2EXG{VBkx5^#k z2^qLqbU)8jiaS!9z40A4)f47)-GS-TL_krpNkSu;clQW;MtY^>aEJLDMf1iFk3mv`GIuh?BGYdy*jwr=1j zLa!CeN z^4c{;u#A*z)t$aZQNhkmJzj||Bfg~mC?>k;{nGq z+qB+~Y+loal|LW0O%_(MMm0Uw!xvlGk&7i3d_A0>6`yZ;`S4Rw`cxlH{i%rDJfEcb zCn>R*DtvS(8*7c%{4<^*9Sh8Xh@BQmh6~$loR@JQwW$f?}|Jk zOl#l%Dhc#)zJb96Zd})_7Pid*Xn7bV7Ct=|6u3GkQkzWa3E@-)!9-1|7xP}wK6sJt z_I5rhE5l+e`L7nTdVB-B=bBs>=93a}x5ti zN)nIVzp<+Kq(#NSlPqn_)H;ygHXk*9$qO{54k4T1bu;CwbJ6u4{Htr^!Pq2&zNs);Xs5n$aBEP|(*wINWAZg)YZYhX%~Bnv{?$5Y zLoe4P{BCa_I*_e7%Faotl$nUxuYqcG#>ogaY6M<_^fm#rZPi!lZ^eK=-ko0l`|^;= zN$ya=E0K(PKi?WR=aSDGDjXaoi5Dvo9<`yaJf>APqh- zRd$0l{s8&f=;IcGx^*ozrmY?08OrDD5!*E^p7PF<6zzSH?ZxiTMEp!#L8q&1MdfYs zL-inPy(aw9B^l%Qwl&-j6sp$n{fq+CIlUc#^*FmAz)xEW!Ytk2eLU`l!5lxJa@x}7 z>+Q=9(;p@yvsNkdTG&cG7!2oxU6~xsE}5h1=UhAGzs!9mSx#&lO6jgHDE7Ycu0&h( zc+K4XoyeFI3+s0Evb>nmnH%_;QtxXgSpwCUBnR+$v1Jc6cW zm3DDI2--9f?6)PA?6k; z!?d(|n4N2XG0dg*v_N6l^kIx$HW=8DPt*dxv`I{?450XGdz;(t0R|c*zrGmX{5zff zH{BnR`1`x1R-ryU4DSA}{U+5hZ0U9L@Agik(lJPv8i!{HB&8y+smg?XEy$DNri~L(nV-K=fO#P_|LYUC|)BjSBt|EpzANMui-qZ%c(15f5om__} z&b(@@nPDE;Z;rvxZP&}GH{+G_h$v?XhU&_RQ+9MU_${-Fer_G*e;O9_r+X*=8{WWu zUF(sSONsi!okx;3QNtK}x2W4#eAVa42TFq`>+3joWE9@MVDyUnMdbX#GwE;5kDHZ| z(sLJOG-d)8DC={i2wpD@m8k6f0Yw?D?G)0}%O3xDLXglFAuKg$Yl|pI4;#tqP15nw zRZ-)9K76sDe1t0vS_G02E+0?P{b@Su>zJWFbmd4(@RiJ;SGvYsR*XCer*HpMGG1?i3`Yh8DPr%#o!YF@(Z!r7g5|EN zc68j<+@$4%3sys2yc`CzTSto6OGG;5!)mIiiH&R%PjugIq&@d!)R zc=4ky!fgCeD5i3BRqi}sDahdxiqzVY@u`sZr_wcij$4~GRVm@b%cE~*X0rU9&UO;d zq^B3)oRg$wN0md`cP4a)E^z-8M@l;7ek<`+Tjo5Q=VVhYuL7R5yZRvc-Mf=5ih9SB zB%!2zKM&}cqE*O>L*UW;XFbIk&}LUckZeYoT&XC;<`glrSA>n6w#&x;o959 zb2YTo2>ZL674vIKU0U$6JC|JX)o^?}&e+JEJERLQYxn1LBQxiFHRW&Q)2*pmX6d7M zp84|^mb9jywjVAo$2k;Oz;N56$xdDS_Hp}O%W^|TVc96cJD)Rtmaq$%7u zK)M>ldDW|Ff!!cBi9a|yxUuy1D-IVF62bo&Hg;mwv8~h5!9Nka8k>H0=|yOWe9d&14X$oo zm_kES>Wo8<-mEDeLHADOGEpi1Bl$f=&i3N#)Rp&t}Z-G6mT0DG2ie$q1uBM zNW|x4K5Lm0Q}bd!rFt{Jl}|);!11~UA(kWf z&)F3W!%P!#P&tAcW{vyp+2KQE1i7d4q4_EyRTO!+1Cgv1HPh-ML?~HE#3MbJ%&9Mk zHR{JW30@@ov;9-SK;|>;WnbB(z97&p*Oqwk8B^X-cZy5yXjiOdWhl>)oY>`(50rn3 z1X(!Aa-OqIp}^9>B>6<_P)$6F_X027AD%t-_kk*k0?8%y(ldv<$W3GwG7l4{VwS8d zcdo=4i|)(q&aN_2#bh5>O}~Hfu;$Iz#~)T%jo>E?_T*Z7quW3mR&BOF9JySNwwme0 zoY1PfmZT)SPcFQ{jg0XqzFB$Q38sV%r?Uq2`5V^@x; zvg}!Fn4VWrgn_;;vy;v`Wz5Lst=Pz`m~#6Qq+6eQq!RykE;PUPd9+`pR+M+9aB4Av zKPt<$B)V0CUoE~foc%OoA`zDLh8BV4-EjtGF(<*xo3UGbmF(MfjBIpyLl_Pl)#;@j ze2>qY0v(6x5;>f8&Q&M7J+;i@9ekpNCv!HlCC4JkDtqOmg~QZLs_M+sc9vTEWTm5e zc@%tAZGB4B&GOx~uU{UubJn#O8K?|wIQYd^cukmPrOh{3ne)ds)5*HMf0TS&xc6a{spR0m4k!}sT;_M@g zuNsG!jc>63S%Gsutu|}K94tFB#+L-ear&kB8Ox^}#{Ohp&H;Jvo)mkJC97X>sI`WQS z0W?5YX5f|*+D>D=%Y)~-^G>t$h&?_pUKFq=o}uo3uFD?|qW#s877#R-aRuLidAgdY zrB)?iG8yDiiDprrsQ3s}4VreQN=!@l!n^r+O-6c6U87l;u%&$RCH-!HVMN5(gBBf3 zbCB-~W1rO9hU~A>w$AjE)@FvLG|3zheCtV7C~uT;W`c4`Yh&zH|1kf_7quSW-X}p% z$yHKHz%SOS_)8LTL{Z3MPi~lE#8j(|TR{&fj?s2r| z(YeyX)1zoB0vC?1Uwu+X3c+Ep*rntBwXFNDz=f z2oPI`EfH|o39>YjL=*^wCG5Fx;e5E?=G*<$`9g8dNu8Xk=dDz|_51&$b=z41^VA0z zctqvU77wjx*EkvmcE8&OPCka14|Hj0Bn$uNfK|Yc1qDXNyt=6zhvkbZ2Xg~!G=5do zk72#Zm^QrO34?@Rgg)1!7Y3fX6+WBXb5SD$y2wlT!gqcl!&lH%-r)(@Vqj#$wSF^P zQom1lUG-wq1Ix%a1u^#x{B18Te*6&2qr`>0{mFA)CP)#;-18;tE1eR$ulU*GCef{i z<>sG`N!ib9>|47P_d=F2o~*pJPx2^6iva1w`rbWC8q^FVT#oXnfNg)JfDfBLIj3Qt z$g_T;cI8rMu5Hb=%V$;B&vGndoJ3W3{Wl@i$ooT$!UszM9LRW=lCyf)Qk z;DI9VS|Mk5!k1-bt=SiQ#GT65#J^&R!d|IjDEx6iAA{M$x<6jV8r95I6GT-sGTbbq z6N7BoXwL4^5s|SpqDR;qbZO>wYfEXfKcUpP1)RZs!l&icl ztCi)`k<30fcXX{!?0AHW!3E`48R?GnQvNcQF>NkN@~kVXvf6){+4-TdcQEp1uo7kZ zO>d_Sh`Np@}s-%a1h_q=w}ZWg~u zYvi5!`aD6!vPb@G~CjD6{+-?*iI@7`e$ub>pw5*N_IoT{+ZZevzA9}r>(Ii@8u zuJ^hv+k7L-_^DET*7mP09v;4UujKo1`?**}QJ>2EWHrwJSZeiwQxDTL68Ad{mwhd* zZOo+CzR)Y4?ml)mhK=!4{IfBJMmqFEx~Oy)V_p6sH}Bo`d`0vNGwaQ$;xOr8&n#-bFuMoHkS4R-VMSPdtpO*Ls2#pL!OktCzVR@XBS1^ z92z5!yy6E~KR;bN8hX=cy~boPGRa2e%+tVGYNul+NA_q*u#oInaK79P{{7xlSB-0d+axJ6F*U#@turb(lhaK^vz~`GE)!T}x4s?cUb&-Fteth0? zTVL#ITHjT(tD9o>V)SU0c-?lTf( zvBRlSqrz>Fbc>1%Q_p)sn)4lDCLdavvni-6KB`N7T)o$Q)bcx%^Pm#xnWwC%roWsK|$)*HrI3bcCIp?98J+;-8`Kg5ipl!K0mV6+v@eNtY=?y z{Zgitah({;6kcJBJDxrK_(Z@+SMni>O*m@}A3PQ(@yuj|x?u^EazDeXUhm}nmI3N@ z7hERkd2qSa8l!LPFZt>mQLfP!vDqu0*lAtXTG}3XYbT}Nr0@(gZA}Z;NToQr2O9KM zu+l2)Nz{k`covx2&TQRCebFnb<6ZSC-Y9kG=9y0t3znFId*6WG=5 zUp|`ShgSJ@)=ptjK^=#s3ZC>CotY}EK_xy%L7)7+ z=Pj7uUDPokbUpY~jwkMNGL!hK`_85@ulDI!uj4{mzbchw8uo}dE(up7Khc|QdUF?D z>0%pC7c#-lJ?F`L!Zwzj{M5eWyKD5&TpFy{pLJ$EHpRWqRlYLQNIg$W3}>f*9;23( zDkp{9VonME<0mYEcB-dFY+RU^gMqvW%kQZ)yO;D=X{D<@Ykg6f5jGsNU=J%V-Iu;T zrzWPf>Q}J>VLdg~!38H{bP@#bBt-uBy#w4}m%O1MvX0hTR7IXTtF&`>e?tM@;8S6$ z#)w6=o4)ZK?nJq~T3q|M&>mKFpmBIG^J|j3U8o~pb|;8Pw|TUD{_dmK%u2b{u+i^7 zsnOSN;EM=Dr)}9EoTicz6Zh`I(=dfrEP{(Bb$P>hrbYhu&!g>uGi8KpWkOif?Kq0_ zX}^&*y!4@fK=t`v#meh!PHw3~&9kqiKgI0NW|U4F!KyArh2wh^ozzD< z;eyp{8U55;!WrX+iVWw9vXu1Wg5Q#sjxhpn-)>Vm5+vwp%de7K-5m)S;$y0eyizWk zEmd)0nOSi!NvEE6Q8Qo-b6A=+uK4ORYH}_&NN637-=T|(jv(>NH@T+=g52pnWp)SE zb3%Hh1$-0dh99z6MR!Vj)U;@l&6wi)vP#oW#%IFut4DDK^uD>`?K@P3l~)Uo5qKFM ziVzB0)68g%8g+ej(VnteHElGbF6esuHbaE3D<*pf4^m#siX7^i6N}za@WHRfAFWw< zuW2NEQ)cEZtJY@9eH5yy`qk0`ZULT_r>Gh=~Dke3DQc^CcptDh9HRJiiXg{V@xBgEg@CXXKmOnJNiX; zeaP)B!vhaQ_#HlT_*~J5g?gwAS0kY*Ymu^p;7I29NSx&78mGSWR4hO{CoA4>Y~S~$ zRIiB~aUuB6%Vpg&tz_#s^AzzSA63^d^mJjm%Cn@gW|Qm(^Y3#dm#chwvSb$X7ILq? zdqIpa?zHTY!=_`w(~g?U+{b(69@ORUkIe*eW4{^Z{-U?oByY6TCR~mdNhgJoy~}g& zjX@p>f&mSLDH?$O71MNX5oz<0h6;&{@pq?80;_wkq4O+`IOj%ayU9u$fdZrp?2RKx zlmVQfAnSy_XzD+&e@ zFeUZ3KX4uQU$R>LS6t<2BUcwX*-W=)c=N1#wBH=@J&8L#dnmd!$pNPKilz4+_0u8j z;fSb+q42eEF>jjvx@t6OskK3Fnd8^(lbyfT^RJ!0DJOPh-6wGt8y)gM0x|J;r!+m= z-5mlq=Aqjfdo<{~L{)VfcI0}FuTMuCsaa9-S|&eeVQw*fN)I3uTwI(di@UiLzSI;G z2v{5aq~`^f0Vij-Oo1Wq43enVMNAWS@j!PM3Jh#^Q$CPaiC-RYFh>&YP%wXC<8v`4 zCL#~ZTJXk^A#p_*@EwXR6f;RQ0`3P$UXQ;uFX`+A2H4^_>^QLdu|(cU?A8{_z${%U zp2`QDFcbNN;EaG<#h9{IQCG65 zZGEn!d_ciou-RD*OTY`e-~^(P2Eir37-XeL004p}powsSfq^O(Q_t%`p@py%7a{bS zD3Z74*0{hh6oHDt4$u`Mk=RF^0SHP4el!1#oKv{9q!YXwbJ7vCyQideyKrO57xhPR zNy#w;V}SVt9oYu>0mTmRSU%Vf9L6CUn{Moz)s+tr=OoZeSq5%IV$LWWMy>`xdDuBR zIz|8iGzAbWx&Ud+DnoQZ^9n@SG5DOez?G6R`L3=U-TW{Ici?T1b%b}Yg&yz7))=>Z z79?b@h*>iW6(ei*EpWhNA(&h>jz6@YpcOt_$GIJ7_(+aq;qG^GHLC z1hHhb!S9X06lk5NkSmZFyO_h_EJXiyCkfIekekQ=c^m^+LzE&xBgiJOW;hGv zUWVwN-q~(haF+R620_GD8Ja}gno{gTd%Dq4$0EBn)S3{yM{xiEIRLaolx-2oAk*Va z7Uf==gj%7!t`b9#x(IXzI{6lnm!WxlfQSdZ{E@pmRnfl%05duWPp}6LBN&J_zJrQl z1gZSsu}+zoRO`!?J(g_%1f>HZc?z+UJHGrn4FH|6>zjtam8lH*ZGoz9^G&5&a7D6m z;PyY`LV)8ER|*XDm27MAhWf#-Dl{YXBD?P0pt~dhTL=zAsECFWpznbd^+;z zzaF_L27y<*cG4jl^k24!18~hDaHT;KKxBV_^U~N+>AxqaPjlkD)>}Q%aBe>`2=zd5x3`NLyIg(N3DT;yc-&&al zjJ6E=H-7i9UnmT%B$m>EY`8?ZK6MH(w*#gD*D0WTDL3gz)3!ANw=G16(ybNJRgA>i zX=c=s@_WztCS)if&TWA!yPgC&15=pA!#YE4<7FN2MSrt|lS*S>yhMo7vXb83DNgdULx3r=lt@i*U>%QN%iiN27YO6R3Mf00z z$~%&3w_S;JYpYleMgOgNyVO@_TRe6vO((ZVS30}3Ex7Y8PHFk2Ff_C-6Y zD>iM*DjQ0Fy#8|w?9aiTh93;5M!ym8pRfMoia%Q5j~4i&1^$0pU`#<$RY60#(w|mb i%fCH~a?tPn++XaQ3M43Pbapy08$FjNk^Zx<|n$`IL literal 17091 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 diff --git a/src/game/client/components/chat.cpp b/src/game/client/components/chat.cpp index ab1b178e391..d19d5d34e6f 100644 --- a/src/game/client/components/chat.cpp +++ b/src/game/client/components/chat.cpp @@ -796,41 +796,55 @@ void CChat::AddLine(int ClientId, int Team, const char *pLine) } else { - auto &LineAuthor = m_pClient->m_aClients[pCurrentLine->m_ClientId]; + const auto &LineAuthor = m_pClient->m_aClients[pCurrentLine->m_ClientId]; - if(LineAuthor.m_Team == TEAM_SPECTATORS) - pCurrentLine->m_NameColor = TEAM_SPECTATORS; - - if(m_pClient->IsTeamPlay()) + if(LineAuthor.m_Active) { - if(LineAuthor.m_Team == TEAM_RED) - pCurrentLine->m_NameColor = TEAM_RED; - else if(LineAuthor.m_Team == TEAM_BLUE) - pCurrentLine->m_NameColor = TEAM_BLUE; + if(LineAuthor.m_Team == TEAM_SPECTATORS) + pCurrentLine->m_NameColor = TEAM_SPECTATORS; + + if(m_pClient->IsTeamPlay()) + { + if(LineAuthor.m_Team == TEAM_RED) + pCurrentLine->m_NameColor = TEAM_RED; + else if(LineAuthor.m_Team == TEAM_BLUE) + pCurrentLine->m_NameColor = TEAM_BLUE; + } } if(Team == TEAM_WHISPER_SEND) { - str_format(pCurrentLine->m_aName, sizeof(pCurrentLine->m_aName), "→ %s", LineAuthor.m_aName); + str_copy(pCurrentLine->m_aName, "→"); + if(LineAuthor.m_Active) + { + str_append(pCurrentLine->m_aName, " "); + str_append(pCurrentLine->m_aName, LineAuthor.m_aName); + } pCurrentLine->m_NameColor = TEAM_BLUE; pCurrentLine->m_Highlighted = false; Highlighted = false; } else if(Team == TEAM_WHISPER_RECV) { - str_format(pCurrentLine->m_aName, sizeof(pCurrentLine->m_aName), "← %s", LineAuthor.m_aName); + str_copy(pCurrentLine->m_aName, "←"); + if(LineAuthor.m_Active) + { + str_append(pCurrentLine->m_aName, " "); + str_append(pCurrentLine->m_aName, LineAuthor.m_aName); + } pCurrentLine->m_NameColor = TEAM_RED; pCurrentLine->m_Highlighted = true; Highlighted = true; } else + { str_copy(pCurrentLine->m_aName, LineAuthor.m_aName); - + } str_copy(pCurrentLine->m_aText, pLine); - pCurrentLine->m_Friend = LineAuthor.m_Friend; - if(pCurrentLine->m_aName[0] != '\0') + if(LineAuthor.m_Active) { + pCurrentLine->m_Friend = LineAuthor.m_Friend; pCurrentLine->m_pManagedTeeRenderInfo = GameClient()->CreateManagedTeeRenderInfo(LineAuthor); } } diff --git a/src/game/client/components/mapimages.cpp b/src/game/client/components/mapimages.cpp index 3099472823c..068f15a5b3d 100644 --- a/src/game/client/components/mapimages.cpp +++ b/src/game/client/components/mapimages.cpp @@ -210,7 +210,7 @@ static bool IsValidTile(int LayerType, bool EntitiesAreMasked, EMapImageModType if(EntitiesModType == MAP_IMAGE_MOD_TYPE_DDNET || EntitiesModType == MAP_IMAGE_MOD_TYPE_DDRACE) { - if(EntitiesModType == MAP_IMAGE_MOD_TYPE_DDNET || TileIndex != TILE_SPEED_BOOST_OLD || TileIndex != TILE_SPEED_BOOST) + if(EntitiesModType == MAP_IMAGE_MOD_TYPE_DDNET || TileIndex != TILE_SPEED_BOOST_OLD || TileIndex != TILE_SPEED_BOOST || TileIndex != TILE_SPEED_LIMIT) { if(LayerType == MAP_IMAGE_ENTITY_LAYER_TYPE_ALL_EXCEPT_SWITCH && !IsValidGameTile(TileIndex) && diff --git a/src/game/client/prediction/entities/character.cpp b/src/game/client/prediction/entities/character.cpp index afdc366cb86..48c8b2433fc 100644 --- a/src/game/client/prediction/entities/character.cpp +++ b/src/game/client/prediction/entities/character.cpp @@ -716,6 +716,15 @@ void CCharacter::HandleSkippableTiles(int Index) } m_Core.m_Vel = ClampVel(m_MoveRestrictions, TempVel); } + else if(Type == TILE_SPEED_LIMIT) + { + float Speed = length(m_Core.m_Vel); + if(Speed > MaxSpeed) + { + TempVel *= (float)MaxSpeed / Speed; + } + m_Core.m_Vel = ClampVel(m_MoveRestrictions, TempVel); + } } } diff --git a/src/game/editor/explanations.cpp b/src/game/editor/explanations.cpp index 1684580ebe7..18eef3f349b 100644 --- a/src/game/editor/explanations.cpp +++ b/src/game/editor/explanations.cpp @@ -147,9 +147,11 @@ const char *CEditor::ExplainDDNet(int Tile, int Layer) if(Layer == LAYER_SPEEDUP) return "SPEEDUP: Gives tee defined speed. Arrow shows direction and angle."; break; - case TILE_TELECHECKOUT: + case TILE_TELECHECKOUT: // also TILE_SPEED_LIMIT if(Layer == LAYER_TELE) return "CHECKPOINT TELEPORT TO: Tees will appear here after touching TELEPORT CHECKPOINT with the same number and falling into CFROM TELEPORT."; + if(Layer == LAYER_SPEEDUP) + return "SPEED LIMIT: Limits the speed of a tee in all directions."; break; case TILE_TELECHECKIN: if(Layer == LAYER_TELE) diff --git a/src/game/editor/mapitems/layer_speedup.cpp b/src/game/editor/mapitems/layer_speedup.cpp index 7ff33c958a4..0ec38e0d08f 100644 --- a/src/game/editor/mapitems/layer_speedup.cpp +++ b/src/game/editor/mapitems/layer_speedup.cpp @@ -289,6 +289,12 @@ void CLayerSpeedup::FillSelection(bool Empty, std::shared_ptr pBrush, CU else m_pSpeedupTile[TgtIndex].m_MaxSpeed = pLt->m_pSpeedupTile[SrcIndex].m_MaxSpeed; } + else + { + m_pTiles[TgtIndex].m_Index = 0; + m_pSpeedupTile[TgtIndex].m_Force = 0; + m_pSpeedupTile[TgtIndex].m_Angle = 0; + } } SSpeedupTileStateChange::SData Current{ diff --git a/src/game/editor/mapitems/layer_switch.cpp b/src/game/editor/mapitems/layer_switch.cpp index e0b2c0f44c5..9279bd825c1 100644 --- a/src/game/editor/mapitems/layer_switch.cpp +++ b/src/game/editor/mapitems/layer_switch.cpp @@ -301,6 +301,13 @@ void CLayerSwitch::FillSelection(bool Empty, std::shared_ptr pBrush, CUI else m_pSwitchTile[TgtIndex].m_Flags = pLt->m_pSwitchTile[SrcIndex].m_Flags; } + else + { + m_pTiles[TgtIndex].m_Index = 0; + m_pSwitchTile[TgtIndex].m_Type = 0; + m_pSwitchTile[TgtIndex].m_Number = 0; + m_pSwitchTile[TgtIndex].m_Delay = 0; + } } SSwitchTileStateChange::SData Current{ diff --git a/src/game/editor/mapitems/layer_tele.cpp b/src/game/editor/mapitems/layer_tele.cpp index f5aca5d2986..62fc3aad150 100644 --- a/src/game/editor/mapitems/layer_tele.cpp +++ b/src/game/editor/mapitems/layer_tele.cpp @@ -284,6 +284,12 @@ void CLayerTele::FillSelection(bool Empty, std::shared_ptr pBrush, CUIRe else m_pTeleTile[TgtIndex].m_Number = pLt->m_pTeleTile[SrcIndex].m_Number; } + else + { + m_pTiles[TgtIndex].m_Index = 0; + m_pTeleTile[TgtIndex].m_Type = 0; + m_pTeleTile[TgtIndex].m_Number = 0; + } } STeleTileStateChange::SData Current{ diff --git a/src/game/editor/mapitems/layer_tune.cpp b/src/game/editor/mapitems/layer_tune.cpp index 89788274a27..50ca56a6bd6 100644 --- a/src/game/editor/mapitems/layer_tune.cpp +++ b/src/game/editor/mapitems/layer_tune.cpp @@ -256,6 +256,12 @@ void CLayerTune::FillSelection(bool Empty, std::shared_ptr pBrush, CUIRe else m_pTuneTile[TgtIndex].m_Number = pLt->m_pTuneTile[SrcIndex].m_Number; } + else + { + m_pTiles[TgtIndex].m_Index = 0; + m_pTuneTile[TgtIndex].m_Type = 0; + m_pTuneTile[TgtIndex].m_Number = 0; + } } STuneTileStateChange::SData Current{ diff --git a/src/game/mapitems.cpp b/src/game/mapitems.cpp index f9b0420b9a2..06c53a1da78 100644 --- a/src/game/mapitems.cpp +++ b/src/game/mapitems.cpp @@ -78,7 +78,7 @@ bool IsTeleTileNumberUsedAny(int Index) bool IsValidSpeedupTile(int Index) { - return Index == TILE_SPEED_BOOST_OLD || Index == TILE_SPEED_BOOST; + return Index == TILE_SPEED_BOOST_OLD || Index == TILE_SPEED_BOOST || Index == TILE_SPEED_LIMIT; } bool IsValidSwitchTile(int Index) diff --git a/src/game/mapitems.h b/src/game/mapitems.h index 215d5f6f3e3..e4b2d9d0323 100644 --- a/src/game/mapitems.h +++ b/src/game/mapitems.h @@ -130,6 +130,7 @@ enum TILE_TELEOUT, TILE_SPEED_BOOST_OLD = 28, TILE_SPEED_BOOST, + TILE_SPEED_LIMIT, TILE_TELECHECK = 29, TILE_TELECHECKOUT, TILE_TELECHECKIN, diff --git a/src/game/server/entities/character.cpp b/src/game/server/entities/character.cpp index b213f0fecc0..e2448fda8c9 100644 --- a/src/game/server/entities/character.cpp +++ b/src/game/server/entities/character.cpp @@ -1492,6 +1492,15 @@ void CCharacter::HandleSkippableTiles(int Index) } m_Core.m_Vel = ClampVel(m_MoveRestrictions, TempVel); } + else if(Type == TILE_SPEED_LIMIT) + { + float Speed = length(m_Core.m_Vel); + if(Speed > MaxSpeed) + { + TempVel *= (float)MaxSpeed / Speed; + } + m_Core.m_Vel = ClampVel(m_MoveRestrictions, TempVel); + } } }