From 7498c1e93257f72cff42b61671d757ae42597281 Mon Sep 17 00:00:00 2001 From: TheBrokenRail Date: Tue, 28 Sep 2021 14:04:05 -0400 Subject: [PATCH] Scale Animated Textures --- VERSION | 2 +- docs/CHANGELOG.md | 6 ++ images/start.png | Bin 31455 -> 31458 bytes media-layer/include/GLES/gl.h | 1 + media-layer/proxy/src/GLESv1_CM.c | 1 + mods/CMakeLists.txt | 2 +- mods/src/chat/chat.cpp | 2 +- mods/src/creative/creative.cpp | 3 + mods/src/feature/feature.c | 2 +- mods/src/server/server.cpp | 72 +++++++++---- mods/src/textures/textures.cpp | 150 ++++++++++++++++++++++++++++ symbols/include/symbols/minecraft.h | 14 ++- 12 files changed, 231 insertions(+), 24 deletions(-) diff --git a/VERSION b/VERSION index 530cdd9..21bb5e1 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.2.4 +2.2.5 diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 86bafae..a81d699 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +**2.2.5** +* Scale Animated Textures +* Add More Blocks To Expanded Creative Inventory +* Reduce Unnecessary Logging +* Log IPs In Server Mode + **2.2.4** * Instead Of Crashing, Disable Polling Block Hits In Survival Mode Using The API diff --git a/images/start.png b/images/start.png index c56ab7047957f1a8b9113d028be3dc9a65342f8d..6566e27c4c5d62c1f24a0bd6d45dfc0bb4efaf92 100644 GIT binary patch delta 26740 zcmZs?1yq!6)HVt#q97olG)Sj_w4~C~9TFoVUD8NB1_(%ZgVH&abc}$2l9B@qjdTk` z%rGCRq1CU}uCMW3EbT z8Hvb7=WT;5${9Na*U1YMtUt~DQWATdPx<8eOl&iRZ9kBBAoo2V>;fPNTJ0NrJ3xhX z;+c`fv_)IqWU`QExRx_W>}9i1<9x+zaW#>cmQ8U z3qH8L=pu6)zTiQ>=%qv?2pk@I%r;Gb6uFI~IeT-p&!sGiQJl9WdIp$$Y`CJqYb}O|y)VmXN+$c`^EPTrh|PcZAxOEPNWK z&k~;7Azk}!*x+J44i@(y&RtQUJZ4;VHP~@cH>BN} zTn>P}gMHj3ojp&LqtcMOd}ncq+IC=;e;89H6L5C$Gqpiy4Gx?ygyAlSAD-S*mW_y@ zs6jbDuEA+UXzEterN-54*mS7EK<9i+_YL)Z4pL> zd&9Td0asTN^)A#lGPJLx;K7UP+Zdou{j!DG$4LIoG=J}MGa%$R81LB$Ew%N$SY8iy zJ?~7~e892l>3nA!MdA#nmc z9#PHAk9Qq`W%mr5;}Lp+{uZ0Yf>ShPb$66Gwul+`Xhh!bVX-z%-1G)TEAEVesco13 zViXNuc`ub^&$;50w)nmxE%!?Sr+qE3n|EBne8uHv-hy9U?xP?6s!JNnWCA&T$RJ-q zQg#z@JRj%QrRC?nI=NfjB~8uriOv3dffyoORbR zSr?33g;pjZL|I`(c@pnIm8A3i(Kf%NuD zT-_nmZob_VvZ0_kdny}rReZQ|`E0W9{f%h>7!iEFg%h7wmgPX;N8hs`gk*$xnFSt!R_hcRDgPErZScA zeAlX-;%X6_NI1SPd3*@%nL3mqAubkQo!SR_s}EZko0iTQ&QkE+SWzA?6#ofGbPZgu z-Do^t&XjJ-{}zm&8vM`LqUo)SwiNE((A73@Uc+JQ5rp^5iFFY*#=M;EI59Tf#0Z4E zecE|e6<%W|n|QxLXWLA&$D7|0Clq@@9krGo;XtG1%$>h*pL7Pj)q%I{(~6h;@4win z0WM20r0Gyu^PiKSS$+Sm-W{|1DnXu5N>0hy$Qs5f<>&Kt#-CxaVb4?)kEZR26==87 zrX%z{RMEMs)}-~*e`5JX0G$=OIOz#6{U*8>e=krh=D6M}oEW{*T3FxHZpY$Q z`QSNGHe3(>)Slq=4TaoH4c@D`XsVxEd4Tv>P>rSQ#8y+UCbMy}F0?TRYfb!lIUi?X zC$8PGd@tMkuVFOLfhzpNy_dubTLAxGU5A{{zhgSK=30mswjB_L=?|)|Bg5W3q z4#+5OJhdjBSgvo%0YoF1zrb?eiO!F2RRrFC_D_O0ZneofeL5R_B=(RC3+_M1Q)JoU zly=d|wN0TO;T=pG?kK5F&t4f(yoXD!9Q#H}5IAXj-QhChoaSxXiZ#WlHUa~?h63-e zgxkmAD%Dp9= zE@e`)rVR04<7oc78s%|0Tv5|z`U900LMeaITYdb)4@*qu5`(o#R+q5u&Yq~*+iO|e zniyf6vBgO6M-^1V2*Db$dbcvx_a_j?{9XxJ`rd``puX)b$!$j=qan38(8(*9k-$# zYPsNRJ~?1s=_CyKm^GRk>g~adJ%z%DUSt~DY5}9!ecuv_Xk%0c6e?Z zRY|nZLdkM1RYSFs61%k;3+OE|QrETdXJyoAD~m{oOu*g6qce$>{M{1=*%n$1fVms; z5B-n7Dm|%AMU$2yZa08$GpuG7*CktPDAqEP`lf7af}hnFS+&gh?kV=eV0ia$6wEPk7Nl-EYNr7{a1dcPbV_b z-2ENbl}<#+L4;uL+0P3YdaYGme>#JFSw$p$ToK6hvvD0qfSy;~~fF$~dXBBcpeQ_fH_@`sl ziO101y^sdEBbFY&ta`Uz`bbUs2*u7;q@pgKZE&X?5iMvDdcGbU-K zz9$P3sMFR>mfnuh)s)pAQrr)!D7mA9Cy*CE1Fhmb7J#le z7}DlyeX7NOGbU~MqA!9hRh^KTN}I*V@!+0hvM&GMgxy2M(M6M^@e|-j0pCF%2AGe@ zN4{0Vr|OtN{ehF=ad^wWlLkw)T&OwreEFBwH?rUsig>zDwKlvmMX9Yd zC=K{pF~WF7NAOU&^PLQ-<6b{B#`#zsNTP-s?fk5k2X4xp?S~)3_tEd4xH>%E?@E;= zP{Xu$mbmxy!_K^}Yy(LF%8i_8cuvr*muIfMb0v9QQE0^-gZVJR&QstmoKi5q;?Kvs zl=QU#z)UBi?1I5m*ZPiDY+Vex9}SHZ+J~#NOo-mDs;aWZWzy@brJSusR?oi&Fx7;| zo34cMjPkT=^Z~VjgLE>;aOxVkBkbO8YU}YN4y}4MxKFmy!U)JZIQ(9oas|3aafjhY zE9=g$7z`QOy9VYe0Fsc49Egqkld#k^ENNQyBz15Q6{HKo4BQrUS&HgTk4zVBe7_)A z+1Jqo-m@hz>DQiK*9bU7v}KJY#5F~|36%C7d%=}mBQ^b) zlKgscECa2-W!JxjJq($f3Pt!L>{C!{d021W_x%OaHedo@uc;LGeW$J^PsjG^4!=k3 zx_=<*)|Ur%^Dv1;U4<}40oLnPE`9DJwj!}W;_qk9tnEBZGGH~6ptA=40(35=lnp7{ zWNnYK()IEwW6SGvZ8Lw1K6t3f<;tBeyXMm>MP#*eo^C%R^cuvW*K6nH-9;Ho>DSqi z!H4x!6iFDZ$4Qael&@=Z!z;W-bJ=&F|93G%ze;I~@WQ~D!9ethHodnctg7LiX(IxW zCnDhP=JJ+TwHz>MYLP8Ma=75$y5Q8|_UM}~IPU+yAL2?dpJ?>elJ0BMUEj*Qc0`}s zR?N{&lzMDxfvxf|bzN~lAkm%9-C}W}w#Tu}^C8tqNN)u+a4}l+l8?>^S)lg%nB==ZSGQCTlr`|Qgx|_sf(D5vcpPz zcUP(n{ZrU-PrI1I181Z7WpxoIF;!!=)Px3(YF2N>Ld#u&iCV*9InF68 z%DryxL_7NwGlkH1>PZN>q8vN236FB1LIHdIa<}o){rznP>D{2v3Qt zym24W@BBL>%45AqgAJav^KQ%tj&~&R#W2Ts{&>lDw{-OOxsITLS;!_4!0fu~SZ>al zbPTDGnrrpD+&A9cMsv6-2E&OrhG`A^U&$6U7Rd26lnmP=19p7s%RYUN9e%=JWdqDn zcf_JW! zIz!V=x8%<$PLuN!hrK}G*~mdAKwrhdD$M{In`6>)9{jC9TfI{&C1QL&G}lUSNEwFr zM>XV>yvT|FrGNhMi0@H%kKIpo%jjE&Ga7yuQ{12C;H3dO2zXOf8qbtg1B~irb4NXb z`S@<)!DQCKUq9dTl&}Yx2l1q*yF6VVZ&nV zZ0ZIlFsaLIeYYZR(M=zrJ{h1fV&TGIn|h{<5}>26v+eH?l`4+=`2x+^p`93VPagYM zBm_;UN|CaB-2Qi{7f;AR)SRx0R6yi$wRduS#7>@1ctw-EyM>j5DCBK}L?--@!fixt zUBgT(lb$|$u*ij7{}LFE+2DL@30Zx~d>0Jm;JXOm?PWm!a|$1p;!@Js$>X}RI413f z59#c7o|VNzAMu>3nQ&A6v6*Qi$&$FNMz;Od=MwYRqw}dPIt)DWpKh|ATdD~jBVl0P zIDE3FpjTz@L_gsh$STlio|$#qvXZY@`%7nt>E!7>G1yNqzm9?`KvmBtbsD((ZGT1Drj@>$k|yu~VX(3U z(Rqx+JQfV!2bhhqYVNp4v0xuaPX078cddR~(tW1=#onG*VRR|Brbk(HU`X22cb3sE zN0cc40HtoxLoBhs^-nRtr6)o2P!{xpF(RrpeM~T3yuD_mTr+2oyRVqhGF_x<_#)SN z9FM+OxJO|@bLHc>2Zb?nL;F%q$E$_YghvzT#*Zt&8v$ylK6j?8KJ7$fA^B(xdD3#g zbN&1?-G+v`MXU91@=5z%R3q<;W$lNj@cE1vbekd1k(KGzh4usaZd7VZm!Q#m z`{i-Wc<%*+R*UO=H2b}3Y)Y*lK9_aB05GL4{=p{VNh_sttD7A%Afuzfrz*9YtmS0a zy*W9#<8NAs5GqSOGj5s+Xk{zPBh1UHLIUD$z0ZUO-ffkm zLa7^{1a*xTy6ecWH5RCJ8x>WJVSxYzECt}Sw&R4!cGO^iMvf8@Dh zUaA*H$I5g}Ba@@WbC=TGsxFe3Noo>!J2d^xU5&k|dMywKYxIQKkE9n9rm z?;mMwa+mI7$oC^97$r;C$@Zw%Hu4JG>p6W(C&Mm2zVrGS<%D6?4FHNYr$o{pXj;DC z**^GGC|or3fg(5<(=hPm_C3v3IvG-Jzkx31G|xe27DTVNCFaH@3CrG=o-4Tn8FlN(ssFFj{oY<=A@ij20MrTmd(+-CkB%18zl5G`?Q6z z@WDku@o($+lgoubljXMaO!xcAuFhx6cYAw;(=z9HB{O`AF3!)FeVz9X1rbXI)%)&I zl+4$l$I&Hevoh$-1JEr4hwM9dBPU~+8!UXf@v7H+4*vlNkHde6n9<10p^Rxx&Uu#n zxxRRXe5vB@tJLh4W`37Z&KF_dV_T&eQ)?7lO<|l=s_*LH%s&I@kP&rfxWFRp@dZxB4pcQ+G#A4d%D)=XT}# zQd6M)UxE?V!Tl{ns~|(aScx@1A(T-dU+>jeH|3y|Oh9w2mXjOiH9xO%yFfbD(v^>2 zIx~4+3+52rdMEjefcx;G3?4&bmW|8hQylz$H*Fl~2`?m7ILfcBM+6=&t~b%kx4l|q zcydc4VW-hyC9=e1m>Vat*{%$adFjLMM(3(g{%ZZaa+xvVd0F@Op87XkZhF@zG2F95 zQ$_NGfiHNp-V#X_n5^v4YsJA>QA9fR%?sXQF%x-k5y zF}>X^74uL1orXF*Yx!j)t|1^kZy0Iq;Yi|F=LVP>Vf2_ADnKkJf2FENM}4JVh(+#T zyuePrFjb~p#mruwVev2uZ$OH)7@0?M_jmF^h^p2bz9RD`TVDBX@>{`evI^+RrRJ8( zwG!cVOOG+(-AJDbF~2hg*aW*QVF~=nOsZagcITn2!sUC!iAL9&e5^MP)!G$X&9i1Z z1Ni0zyUD))*HQt-n5wj4w^*{SJxUunlsA5!`1{Sz&3~E~=O!ug!dPq_hOZ*7aC&a( zp=vXT&K*okwZlbi6_5Hpy_A=1va~3F$MnZ8R@|T!t?=#Dy_7eSEP9w%;Zdd9KG%?k z?8WSkCiPQP*z+U&AnI!zbLH|@K_3uvdLZsuxR|7{@R3p~JPbpSwwpoh)1|99;qdCM z!W)Cv@vl^*b8-!T!e}N0_>rS+pN+$8IT@hjp{1?_B3ewqkPP1XzM}}Wfd#bPyDYs( zh+l>(f+^!3@2yTh%&LXd=TCWY`G9d4`DY*D$-n^BWiY0r&@`!!RPrBrTd6_WnCpQP;qL2J z$w_HReJ(fMVkJd!@hoEN;0``P%a`JJ>#&{Muf_by-H3XV=L(BjUJS{U!Nh%-aOZ@6 z7rR@t{GZTJPSuLwk5_OFLKX+)Ri zVQ#rXzvk$p+YrLMoG&}k+vpH*7d2x%-|2g9`XvA(qw9!xfp$R87tK*)T7-C#@)pac zdQLzLH2ZaP;3HAk$0g44HE5%4d6TQO#^jSSxJGrBw+vxfzwU zNOmiW65UdT=2Hl7v9XPFE6wI?#y_nte9O<1t+tRb&4o7lO@Vj#&3AjG-8;=31#3m{ zFHB9VdUbE`)H?#i!NF;No^@Q+X~sRIq|`W(B~UHXEbu{jP@L7k)P>)I2rjz7U4JI0 z(`tr0chZ;_Z9D#3ws4;??`dLUOKHM`VDCQP!17?1b3L-D`pb~DWzRiI@)+Z3Mgg9{ z-?7?WXJkC|k){bA`x~BTel%%qc4i4`vnGE%=j)oA?VN#x)Orl&v2==3`KGQC2oI0i*l+( zd9+M(EGg2rcCFrRkF#VXeu((|@H$J>M{hNQcn9l@>1Ly`Dh-V(-1;q=&-t=}RloE&}Ds~EW7j#W7l6^l#~-7 zy!P_4WxVd~Gjax8+Gb;LQ?v@0v$h%VR)PohU$BkZW-B z@1~ok*jQB_7f4}~k8$g!iYf+TW`Ve1e$U`w z*$x9r%^J3tqf8mFd%)iLDzL|?GdawR!J&d&yR`G3B&dCR6kFJKM{aaeI7jK5E=`>_ zGdT(4wGn=unERrsl~G|s?QHhw7hHvH!zg8KonMT0%B}Ht3c~eX_{2BzSq3Rt{!rVc zA`1Iecx#-%sm4Y2!}~Hu;2H!;s-_Hczc>;RFCa#>ibqOo4)&ax5E&$^XcQfq$GB`4 zFz9F9+TF?2&8HjhZFym8uk;d9YX)%#WV;khbJjvsA|oQ^4Hs6v@R_T*FIlbqtF%dd zaPIP0KQ+Z4m9H;bglc|`4ySkBCrj`7{r=x(K;h)-PPZn2C8n|Szs;Xsq}3XcCws1D zv*6p=?(?UvChA8iv9c_E9+k=i4QiEsa+2AGOlH40P$x<9`%ElB>$vKKrN zSiGtFk-A9yw`_9FTXmS0LZZ=3s9UB2WzX4y;YJ-_^~23K!exIy8Z&bwlSA1S?~&M z0GoJ$y!euPjR@5K#$;MsHsQy7VJ~&Sz;MfUM?&gjl4FH-$Dq~?dqaE9ir z8g#C@LIBdI8K&g(5k$~Z`SKGWJAAh_M# z(`YsR>B_0_8S`c0#_~(BxsngnBeR`UoxKJlQ`yfst^FDw1TR_Ux!x6yVcJFzS;g<} zQ=Hd7POKqk2nMG7N_M0HL(P@+E}?FaK0}O)W>$v(q9E79)EvAGvsD)H7=1{gBmRJA zH=?krp|>`u$v0kYwzjZR@L;_j(=+LeCKT*Ow)GUZ&7;Cz3ngVUy(|$4EB(e21;!%N z8fxcK5Hrisaq>V@L_l_eV~S&EmbQ$IEsST!Zw@)SJBW<3l?7y64qTr0WXN&F|9(LI z_(XcBE83S+JSSF@(}tnyPHLIo&(FdOts$DXZSe^Ef>kb$bLY9^4*7?ugy}p%`?5&JCNCtTyH1%IS|NQ{pdu>@iq zSUsZ6)MV5he}#Hnz;Va~-2I=P{$byHZJPOWdOd%d^B&I(XTU|8wvS;UA?B0cp%%gl zY)8LrV(JVE|ne8la0gmPCmY{j=xHJ{CM!T&Ul#jj9(J=u?DbI zeR}yME51hhptag1&$aP^m^Bn@kw$F&_?~ALo5)X@HrWI?%G+^U~}A!;sR-Et-AQv8WE+9W-%xAfXeslm4oI=uN@s|BWZMJ>tHc65|(qHU*0?(dZm}Su3xiI(W2h3vvwyu?iI1+j%paVefrFrx!TeT_ssC+`RCY&)o zGovZAN-L%3?;7$i-bYdqVNd+JMw&DTjWa9FmW+=Y*mwHWYVPse^Bno!_-FrbRv&#@ zzYmsdykt{oVIJ?5j4A6!fiM%Ma(zT_s$Y zi#%O-N^+Ny=WIYEAH!A#MMINzi0`q#^1x^p3^2Ow%#fg=u9N@dDD))3I;YZH6B()1 z=oau>a<=wyR*ixYwnPqTz1jMrKpEKSMw}^(dy~IA8E&G3HZ&ZOx;bA{`un*C-C`+CE*&IZ0kEMeB0xY9ye>s6_cocS=prOhH7{yYUMMND$<9A`#OkLCf){!#)3ll1D3S)u zH>l#wnYhcM;aJ!^3)?vh3oRE{PdAA)r0cYS*X`cph2h{~J+Uz!7SJF@M&VSgcB&qu zzOSv8d>oK?LyGY>E2%z8b4!cZY>#*5&Vx0{Y}RNpt*43XbMnw5Q% z6&t=er!0z*(v!yz2&SmJrLeK`ootMpLv}Yq)w>^YlvhSpX<_TwM{xQM)<@a2=UNdY zf|Vz#jTcEgBCmiYzK2m*d(Rez@$K)pmtzwt)KR_9afI)^rD8^dkhsgiBKxjY8ry}V z?$)|kV_9n&7QJAQVQ~nR_I~Zm|AM!?3Xf%e{1e1U6rz0Qt zJBbt@kKxJgpD*Xvn(Sx7Ye4%f?97P1+ho{Y%P$@A(!6}&-~k5|GbQcqZsjfG`Lx== zkT>NjR$n{|dH8QPr$Cc)E$#+YlroMKCXhE;P+Lp>9=@V)yK(Xk_9<1n1mk&1y1>K5 zY&i{>4ZgX}+C?1JWgVZPInX?x;`+20wUsygM&CiQIj$v0u5PFl6IGst3i_ri+?l%L zs1ai~{M6;{!PW7=r@@D5u7fH2a)e8xcJ=9AGtr-r87s^hs3*p}DFZ4chJ>(|caMgO zP5DuS#9<$CQYq?}5_d8)GylNhCTFxi=%3RAk{g7vm>{{hro3P#yyX(I`9nCN(2`IY z=iuwd(QX8a9BTuU10WHJ`f=UEfilxYc*QYheGr3_kYK#`m{LmJ2AB48@p8dnWK)V@W4|A=e2mv{Ng}odJmpQmWIWR7ufe>iPE zVBhs@xiKDso&I2N@b9u6=*j@pi>`>rECe=TBbz5!0((Wpn^#>^H1= zs)rbC0^}(Yz`u<8d+k_|2ObFZA<~q4i_yXo1ast&Uz17Eplq>S$*J#44!=8DxW_^3 zoi!*S-~*qZd1Y}Rho6lIsl~{GiEZLnZQ#E$KkGHXnQAl&$hG)(yUfAn?1%F=+R9YQ z47=aiKgM77`D)l~RBL)FtrcL;1-dP#SikIVbrKjlu_;V1OXYit;v@_8%j%F*r5~)c z-QC@18~I46ulgildvS#pW zh;h<_gxn3FF^N$!5;)v0+veN$2cusK?@Prs zV;8ypKJ9K+K{N(b zw_K*Zs$r9#$>dIH@Lp}4^5|N6V2L@wgfQdPAd@K0m+nz3FV z=)rZvZw`puGS1IL$zPgRi!>a4pXl`&d5Q>h-#^*K*amDezE7`FhUkp4mI@k3P~u&T z1`*WLmjgBmhe6vC%!~Ejk-qc%XHCd5L0owI$-_kLy)|_oRHGlM4E^d{pq_JOsu21-&7=2_RmxO#nNR=bd& zZ-O&cL||#G1u_GDsu7*6)!P8hd;krWjq>*wu>toqd)N45;vv&!_=)TMQT`H(lY;~IZhA&tM~Zq;U8S27)z|9kQ3#hL#Wx__ zvrIVdr4U?_=(Tj_+I6ULxVSkT?PimCEBLs*5E&@j3j(p#dNm|Q;<3zhxmIE2dp+Nd zx|>NQq;FOX*xpzp4ABp+_Bc!|4`HbaM4Lm%SlQrE4V^dSdwaVXLP#6^yc*NIxo7f= zniC9#6OL=43tcaMO#ONZCL;VP(_tlt?Y{oDd&q0&q+|EKw>dZ;D7r9Q<=>&Zt;%?k zytLPyrHS>lT*#SOeXDd9KE8aCv8+6>C?Q)>%H=uMLyG*J94@uSL9SP24aSB_2TxKz zI_HZa?>fYEXS5tF7vH~&G6u!e4TYk@ctFuE0aQ#OaZ{gb!>j@00iH%L8i_)u;Mn=4L=`+<4xk(5B)p=AQ1qlug z#+H7_y;Y#geKGoO-Ls|c%`K;Yvx|#XxcUHx*Vnl`kePYAv)VvAS1?xp1)F{z>L~mQ zuE%DPp;=!34(2URd!_lG8W{LZsmjJ2GT|^*B6szzPVdRK*G|3OE-%U<(~(&?!_cf) z$#GI20@*Lg-MjG&FiX#K4CPDuoooxAjI+iRe_$#uwUQ7MqwOI;>InvWYXXefR?lho zH<`mWuV|;u>JnOlRT54M$q`8g=gC3tFR1jO7q8VdOM+ z)OC>n?_vnHxCQwsE++Q1q(AGz2R%YMlqm=Dy)XAb=JmbYW3Q#u{c1eC4F>U>vz4vC z_)}s&rl|8O37MbmMdyB1wEVNPy@ibW>mqJBU8bAUH7imaX&ss(H&G~$n~EPsWe`R6 zvikZR5a4O%Nj<5v=wPrs@){lX__D#HcS*&UC-i$$i3e(8kWV*6WwTbr8 zrJ&C}2?+@_ax4!=^jUD{TYVmOzyv?pp2yqB{XY|d_Tl5p+lSDWUF8HqWFP!k)628J zo;p>@Lx6ZCqV(nV7I^q$CyTD-*PHfaV1MTT2VFqx@}^vW_#ckVPcG}+$OiXJpiTPB z#;-r5aANUJd|Le1P!I=zpUfB62ze?x2h!+e;hq~O|#h$uzCUsHjR2`oem6dfZ z^?L`rqF6HI1+g~+fI@k4rx1k%Pi?I{`;`SBsV~+!hN&XoiAg07K8PQDH_I_~j#$cr zH>Uh+S`XH-vZSLE{$)4u%dVrPrtiC`wWbDTE7|Dnm^n7z{W+tMqukRD$JXY4|vs8%D)15Y*BK@s>U@)bsV2&&4_t&Bp+Q-Ag z+z*LD%-_NC7>EcC58MUPq-n&Z|Kw(95^d%*+ycLTlC5#D(rJMblTyLBSC-#OdwnW6 zm(n_^)DpnilqcU#(a#)w6R(Mh#$;p>!|`VJUs2Emkzk@dehLQcly*z zc)GkrSGquLUtcA2=9cAhz>0O5q23^8nkwhSa&^G~|HCLk!JrSdHhs%KDsEcSo@@-A zoh!?pPc7vs;JWU|yNDA{r8zq}9Zf6;BAD*nG%(xD%%Xdr+_V7VrEs}ab&mG$NO!#V zhgV187xS=pWr)B)^kA-m0TF>KOr7U1>1PLj7FXbCH+7KYje{X#z;1#@x-XE^?Xc6$ zCD67B;wB|~WLXMI@wBIBNJf{64}WA1TeuE=Ado!VULyR3amM-W&H^xs)@l?>P_Fqq zd4ua$n}?_N=lW$I$n^y$b@v0m@fU>vZjYWsIZC|;fr$)elO#mCR2aEgdg_e<&5Z>D zTP#3yH2LIf_+=SsE-xgEv3SA}H*>Jhs74IoeGo5rk2DM^^?~++O8gZSa($C0DO<9o_V5h`n4niP;Wz0cDgbMv< zDvJM%#sN-cumY?f)XS~wbN5?C>n_+*6*Xh-;4dCGSf6mZ%(Oe2?kFfJOd=p){}9;#z314CWE{lb{K`#LE`yTvW2cNDeuOBSE2y*vt}{j#sOKJ9KgsH?zA zH+7vX*DLw{E;;m~?rVCQ#@x%S;dMznHV>U}**^peNTX#V z4o|GrTI98@G^?>7*ed_!s-XcHu7>@9!Z|%My{hnFpUeH@tF@I&nDF&@5v*>%wGs9h ze7mtyiGtv4;G6kjPGMoq!m1Hj4nHz0bBt*;jDdVitv6l)>pG4yR{6cBOerr%1@ zExN|j`#;BooQ%oXo;18+XW~<2)CNy&jf1mwN>s1B@So}nM5`*6xJw!$o-qG*kv8QO zvE~@nrXZi9{6F^m84y}g(FSj}0LP5~cQ&_GB=!HE&80pGX|b11sB1{C|GKy3Js1mg zpON*Sku3=zNz8; zjtkvq?p!ED$Vae*DJf;r?yuEU*~q{D7dx&NY#f;*N2gwXf{+^tdZMT#O82BN{<`u+ zaI;+Nu0*=D#8YY}3{EV2S~|W?KgOT~LTq_1pl=ywSy_d_?mdEAX`Xtf!L!SX4;e9` zduSlr2o7EM#$Dg)dfk0t25s7EW-Eq@cd*zBCacZr6>BlrTO7RXR2opBFu5ELd0}xb z0Y%k=Efvmx&>kIbgASZYT2Y}SZrYm*{BMwZ?M~7MZTh5L3Tj{x+wSr1TkTYHd&gLN zh)I+ArM_{}M&Io; z&z_`iy$ID|{Z!?~r~ak!)FaqXjj zNp84DNi2GlfT4t(ijtxVkz-cSjC1s^hV@JF!atQB6Qt*m!=>XygA6I2Xw{`OOLMEz z=Bq*yTUn&5(ZoiB3X#!NTrHG(+Ry^q0JoxVi49?B#j03{X=ZQ34ypy%JwZZ;eI*5T36r& zs|kr}31W#-0~=b8mSoGqiZ)f#rEG$AydmW1GY7)jTsK4t2;~~)u>s8yOjh|52nZQt za<@idyf_>jU1dCtS1!}Uw7qr3os0z3<61ML&7u7;t%uSbZsW&-V~UY3z?|+|BsBSB^ws zWu!i*Y#BqA)J*bP0Mm3+oA;*NZ83}bCZitCz^q9ul=ivnoEDC$ zC|9>cM$u5h1V`2I%gIZc{fK$3vW_jXF5>JQdC4Mir@U2$m1 z_Z1Gs1f*AZSN8c_Y3vK)7@23FT3Ng0j<^Kuc^X`P1!0R0Px{|+s_VGwzNVG_E3oNB z@!Zw{G?7$RthQWUBsz6>1rvm8dO5Z={h$^i?X#NfPCdm8a2FfsiXxPz-^cr z*Yz{^W*UMp{_)*(9MGg_`0f(qZZ*)Ic0Ia7pLQ^hE}uI4-$ebt@-(r|!W|g%P}Q^q zyC&7mkTpUJMY%$j-gX-`#ea%l+}4|Q@a(N1FGtSE1nmpI!_>n64G`aVrxY%< zpC8{|;RsO6(#oJHV~{QEx1%tM>=c~(4%?NR)6}g9kJ$zdh(<8rP=0R=Vzp>ez^6wv zI09KUzu8CRr@m(mANHyMV*Tw{v+XMz1LmwXWBJW3i&1&~w(UZ%SZL-6Z1}i34_EON zzHO#h^gAj^GOblRwQ2&!hQ%O{P+UR5Ao(s2yBH|LV~Tqj_y6NUkgV<#W8ci2`soww zsP?_0tsjJ94YsB`Yprq!`9)MS)Nu4Hu1OBM3-?4LLd8MaO$N(np105J9&7=ggXuSC zh9hUO$J6~j!HqC`Oe5+4)>jg)|Fhk#ibK_ul#EX`Uqe|Kz$h}5PkN>CKz4IA^8x#I zon9rdnFO8 z3M%O%U9$BblJgLM;e&fx)K~sYK^9dt%sOJAZYQ4bO8)=mn88t$Yo+`8YS$g{f9Gnz zs%)|z2R&=*B~M~jrB8aKO=JolkNIz@t4)~^ap*V3H`kS^t*e=-7P@eOq>NXkPW6N@ z$L#-^1GA5_Mu&q>GxI-Zb6~vT`^?6q2uRicK7CJ2^8bAU;Qw<2%ld+5sGu$Q%3*4= zhIB8v?jXwqc7Ht!9x~INdubj$c%mSlek~ZZe22IIM$C=!KhEO1uZ?09JcG6V?=+BP zBMiJJ)C%$cPE`JXw*ZQ)3x96c-5L3Lqx(L4arQF5grS})^o_Vb4$Pb4-&WqvUNp(} zScb9mt^xkF7{V;^VANZat}lxl$VseXWIyhRZhIdX+WXy8w@{d9Mgs`2+KPc5Qd@7f zdp=g5w#5>b*13BFhx{f&CKl2-eRVnNjDhzvN&qy@3RK$i#=vm}1XY~{9t_zsWUA;zRsJ?myP8c0qJWpoWwpc--Q=pW>TjB!DJI`MH&jAYX zgxNLnWo1ng(jyR3PE}Yq7zyrMZ(z7B3K6 za$95o^iEHbwJ{}7u1I8APp%%|sl4{j@OS%spW3~fG(3&&3kNW!;e9jb{jYG2Vo5g6Uh=PwfWt zRK|q8WIBYc2Za9C%_9$>Fax;DrbiCo@}JTN`XuR6^`6o}9hJJ%(|cbZ?kqbk^i^SZ z6HIYVlXGujBgJy#QsaL=aWMm)$OrV#{h<-yE9AaJ_~r7I_j@U~`$LZ==Q>X;$jSbL zF{a^EoH>{R5V@9RJ574hJbPUK+t8r;G`PB?hA`_lVa0C+P7Ji@B$6F^633Uz$J^ue z|J3#6@lfsm|L*N}eM(VDLYkzKY%L_jlr51&X~NiwhHP1eEaTi;NwURQDj{1G%@kS2 zU~aN2V;}pJ!Pw`HZOnRphx&Xz_4(bef97G%!+F2X>-Bs+U(eU;yw4F4Nq=4?ms|hy1S;LVYlcGCYdBZxc~E$BQbKu6LuN@Qi$)8@GDW zco6dT*`D2AB*|g7K~_gN?hB+6BrZFL+57>GX}#Wjp76WgVywSn{PA(Qi#mh2bt*_j z5Dw{|*}J|ykq;W&1l2JUm~!XE!KC7irZ%;Sr@*@8j-=Yy32Lj`NRW)LJxFvA`?o=R z?%P29;^V2yFWLB@AY+T`CWblUWC=r;8}BofAfns_^!0eP^~t-c&8|JG5!AXM=PKE( z8A}nAH@^C0y8_hkV1gNdG}W*j5w5XR*2mTbv-02dLN?vI|4*o3l+mb3^(EM zur$k^29Q!Ka+WC*di_GOTu$oF9s7Dd--I2+WhM`_yp+AA!o@1_gX9vzDZcy>nl>m@ z%dXScpl_y7pUp7c#ivgs(PIxxGak{gStx&8JJ32x4LaBS9C$!S0>_X@g9T`(5!I)Y zE=;-bAn}%-$K{Kiu5pHe6bb#SXTEZ%8Zyq1G`9Pvd|0;Gyet=P|7I&oA;H{)GkY)< zxx*$i>(kW(5!)(ms&@8wJNgJy9zRG(tJzF;&sN~pk`~XU>aL7bz z9)Bq9u@Ys$!?|ftL*%gs*JQ@5weXdN%KQASl-V=aSLDtj>6u=#Txg?3)C@AAj$vl2 zfTJ2|e2wnu1}gpz+o8rU9~yG2`7I%w(aA}yfE31VMT&&4?^dyk9Ny!)Ug{%0;ADSync{dcm0 zVe&h+O3Z|Z+)XLj>VG)NzZ;;p-y5K==ekAE?lh!e8*o$VwK1~aeQA7I-33MoCzSbX zc6?(eX5x(rsdytjd**y4FVBzc3d zQ%!i&nNwm1!UR%Ni50lpTZ5D1z*}u%rGeFBA)?S7Sr1*`Y5`+$fcH0g!C zEh`Bv7qVqvzp~iT>osJ{L}iArxP!|vE4~frQR$X=kGr+8z#xr;i|{u>HWIGf+|lUV zDW`fmvkwnXqGO@5aqeQ~7gC_En2C70nRZrv&vU?d6m5h=0%{>m&-YrLN}@+rgsb_Q zw|ic;kdZ$Yb2Q37qHQ@Ly8>sByGSnc8oapi?>kp?*ZJa3-xyQh#JO$t7sZ{IMx~{5 z#Wn`c!kR8*i}7a+*qm+odM>YsOZJj|)+q%S56D_gnzmd&;tGSRvx!{9X~edO=ow^( zp7$5c`DYTBIMt2G_Ltz`>GI%I@EOFsIa-B#gA+v+lk|VFuSW~|2`uZMH6H-cJ=Ejc zmE3FCmuGZ7(Cw*MytZEo7}9y4xnX9ue}*LJVf_B!xLEq>9%!KShN}1L3DNE6J#Rdk z*$(mE3RLj^MsD|>|6~wJ+^qh|c#*Jw%RiKnB7@C&v(7r&pKWxI3Wr+%y|<|9v={MV z%7+WPTW9-9$bjxEjMJ)Ml}10;>owRrmoRe)GdN5jS5z5X!$m&qUa3oM78MXLUQ<@F z7=x<)#)E%AwX*AwsEc}Xal9!h=r5IMcZdx#ln!q?jku33NlhyeX`yc|fzn5ZRdcIU z7h<)Y06IlKD#NuP$3Gpk729-J=|uf=rJUihl|N&wPTW_%0A+=XI&9!H;?j;gxB^Hq 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 delta 26688 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 diff --git a/media-layer/include/GLES/gl.h b/media-layer/include/GLES/gl.h index ba1d9fd..935917b 100644 --- a/media-layer/include/GLES/gl.h +++ b/media-layer/include/GLES/gl.h @@ -7,6 +7,7 @@ extern "C" { #define GL_FALSE 0 #define GL_FOG_COLOR 0xb66 #define GL_ARRAY_BUFFER_BINDING 0x8894 +#define GL_TEXTURE_BINDING_2D 0x8069 #define GL_UNSIGNED_BYTE 0x1401 #define GL_RGB 0x1907 #define GL_RGBA 0x1908 diff --git a/media-layer/proxy/src/GLESv1_CM.c b/media-layer/proxy/src/GLESv1_CM.c index 2eb0c6c..8d7d095 100644 --- a/media-layer/proxy/src/GLESv1_CM.c +++ b/media-layer/proxy/src/GLESv1_CM.c @@ -1099,6 +1099,7 @@ CALL(58, glIsEnabled, GLboolean, (GLenum cap)) { static int get_glGetIntegerv_params_size(GLenum pname) { switch (pname) { + case GL_TEXTURE_BINDING_2D: case GL_UNPACK_ALIGNMENT: { return 1; } diff --git a/mods/CMakeLists.txt b/mods/CMakeLists.txt index 7b3e4f2..d6e16b0 100644 --- a/mods/CMakeLists.txt +++ b/mods/CMakeLists.txt @@ -54,7 +54,7 @@ else() target_link_libraries(override reborn symbols dl home) add_library(textures SHARED src/textures/textures.cpp) - target_link_libraries(textures reborn symbols feature) + target_link_libraries(textures reborn symbols media-layer-core feature) add_library(atlas SHARED src/atlas/atlas.cpp) target_link_libraries(atlas reborn symbols feature GLESv1_CM) diff --git a/mods/src/chat/chat.cpp b/mods/src/chat/chat.cpp index ed17e87..f086b7e 100644 --- a/mods/src/chat/chat.cpp +++ b/mods/src/chat/chat.cpp @@ -71,7 +71,7 @@ static void CommandServer_parse_CommandServer_dispatchPacket_injection(unsigned } // Handle ChatPacket Server-Side -static void ServerSideNetworkHandler_handle_ChatPacket_injection(unsigned char *server_side_network_handler, unsigned char *rak_net_guid, unsigned char *chat_packet) { +static void ServerSideNetworkHandler_handle_ChatPacket_injection(unsigned char *server_side_network_handler, RakNet_RakNetGUID *rak_net_guid, unsigned char *chat_packet) { unsigned char *player = (*ServerSideNetworkHandler_getPlayer)(server_side_network_handler, rak_net_guid); if (player != NULL) { char *username = *(char **) (player + Player_username_property_offset); diff --git a/mods/src/creative/creative.cpp b/mods/src/creative/creative.cpp index 8f869ae..998e592 100644 --- a/mods/src/creative/creative.cpp +++ b/mods/src/creative/creative.cpp @@ -44,6 +44,9 @@ static int32_t Inventory_setupDefault_FillingContainer_addItem_call_injection(un inventory_add_item(filling_container, *Tile_topSnow, true); inventory_add_item(filling_container, *Tile_ice, true); inventory_add_item(filling_container, *Tile_invisible_bedrock, true); + inventory_add_item(filling_container, *Tile_bedrock, true); + inventory_add_item(filling_container, *Tile_info_updateGame1, true); + inventory_add_item(filling_container, *Tile_info_updateGame2, true); return ret; } diff --git a/mods/src/feature/feature.c b/mods/src/feature/feature.c index 476af7d..fda15db 100644 --- a/mods/src/feature/feature.c +++ b/mods/src/feature/feature.c @@ -29,7 +29,7 @@ int feature_has(const char *name, int server_default) { tok = strtok(NULL, "|"); } free(features); -#ifndef MCPI_SERVER_MODE +#ifdef DEBUG INFO("Feature: %s: %s", name, ret ? "Enabled" : "Disabled"); #endif return ret; diff --git a/mods/src/server/server.cpp b/mods/src/server/server.cpp index a748c57..9b4468c 100644 --- a/mods/src/server/server.cpp +++ b/mods/src/server/server.cpp @@ -198,16 +198,20 @@ static unsigned char *get_rak_peer(unsigned char *minecraft) { unsigned char *rak_net_instance = *(unsigned char **) (minecraft + Minecraft_rak_net_instance_property_offset); return *(unsigned char **) (rak_net_instance + RakNetInstance_peer_property_offset); } - -// Get IP From Player -static char *get_player_ip(unsigned char *minecraft, unsigned char *player) { - RakNet_RakNetGUID guid = get_rak_net_guid(player); - unsigned char *rak_peer = get_rak_peer(minecraft); +static char *get_rak_net_guid_ip(unsigned char *rak_peer, RakNet_RakNetGUID guid) { RakNet_SystemAddress address = get_system_address(rak_peer, guid); // Get IP return (*RakNet_SystemAddress_ToString)(&address, false, '|'); } +// Get IP From Player +static char *get_player_ip(unsigned char *minecraft, unsigned char *player) { + unsigned char *rak_peer = get_rak_peer(minecraft); + RakNet_RakNetGUID guid = get_rak_net_guid(player); + // Return + return get_rak_net_guid_ip(rak_peer,guid); +} + // Ban Player static void ban_callback(unsigned char *minecraft, std::string username, unsigned char *player) { // Get IP @@ -275,25 +279,34 @@ static unsigned char *get_server_side_network_handler(unsigned char *minecraft) static volatile bool stdin_buffer_complete = false; static volatile char *stdin_buffer = NULL; static void *read_stdin_thread(__attribute__((unused)) void *data) { - while (1) { - if (!stdin_buffer_complete) { - int x = getchar(); - if (x != EOF) { - if (x == '\n') { - if (stdin_buffer == NULL) { - stdin_buffer = strdup(""); + // Check If STDIN Is A TTY + if (isatty(fileno(stdin))) { + // Loop + while (1) { + if (!stdin_buffer_complete) { + // Read Data + int x = fgetc(stdin); + if (x != EOF) { + if (x == '\n') { + if (stdin_buffer == NULL) { + stdin_buffer = strdup(""); + } + stdin_buffer_complete = true; + break; + } else { + string_append((char **) &stdin_buffer, "%c", (char) x); } - stdin_buffer_complete = true; - } else { - string_append((char **) &stdin_buffer, "%c", (char) x); } } } } + return NULL; } __attribute__((destructor)) static void _free_stdin_buffer() { - free((void *) stdin_buffer); - stdin_buffer = NULL; + if (stdin_buffer != NULL) { + free((void *) stdin_buffer); + stdin_buffer = NULL; + } } // Handle Commands @@ -385,6 +398,7 @@ static void Minecraft_update_injection(unsigned char *minecraft) { handle_server_stop(minecraft); } +// Ban Players static bool RakNet_RakPeer_IsBanned_injection(__attribute__((unused)) unsigned char *rakpeer, const char *ip) { // Check banned-ips.txt std::string blacklist_file_path = get_blacklist_file(); @@ -420,6 +434,27 @@ static bool RakNet_RakPeer_IsBanned_injection(__attribute__((unused)) unsigned c } } +// Log IPs +static unsigned char *ServerSideNetworkHandler_onReady_ClientGeneration_ServerSideNetworkHandler_popPendingPlayer_injection(unsigned char *server_side_network_handler, RakNet_RakNetGUID *guid) { + // Call Original Method + unsigned char *player = (*ServerSideNetworkHandler_popPendingPlayer)(server_side_network_handler, guid); + + // Check If Player Is Null + if (player != NULL) { + // Get Data + char *username = (char *) *(unsigned char **) (player + Player_username_property_offset); + unsigned char *minecraft = *(unsigned char **) (server_side_network_handler + ServerSideNetworkHandler_minecraft_property_offset); + unsigned char *rak_peer = get_rak_peer(minecraft); + char *ip = get_rak_net_guid_ip(rak_peer, *guid); + + // Log + INFO("%s Has Joined (IP: %s)", username, ip); + } + + // Return + return player; +} + // Get MOTD static std::string get_motd() { std::string motd(get_server_properties().get_string("motd", DEFAULT_MOTD)); @@ -532,6 +567,9 @@ static void server_init() { patch((void *) 0x737e4, minecon_badge_patch); } + // Log IPs + overwrite_call((void *) 0x75e54, (void *) ServerSideNetworkHandler_onReady_ClientGeneration_ServerSideNetworkHandler_popPendingPlayer_injection); + // Start Reading STDIN pthread_t read_stdin_thread_obj; pthread_create(&read_stdin_thread_obj, NULL, read_stdin_thread, NULL); diff --git a/mods/src/textures/textures.cpp b/mods/src/textures/textures.cpp index 450e2e9..4b54f91 100644 --- a/mods/src/textures/textures.cpp +++ b/mods/src/textures/textures.cpp @@ -1,3 +1,9 @@ +#include +#include +#include + +#include + #include #include @@ -16,10 +22,154 @@ static void Minecraft_tick_injection(unsigned char *minecraft, int32_t param_1, } } +// Store Texture Sizes +struct texture_data { + GLint id; + GLsizei width; + GLsizei height; +}; +static std::vector &get_texture_data() { + static std::vector data; + return data; +} +HOOK(glTexImage2D, void, (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels)) { + // Store + texture_data data; + glGetIntegerv(GL_TEXTURE_BINDING_2D, &data.id); + data.width = width; + data.height = height; + get_texture_data().push_back(data); + + // Call Original Method + ensure_glTexImage2D(); + (*real_glTexImage2D)(target, level, internalformat, width, height, border, format, type, pixels); +} +HOOK(glDeleteTextures, void, (GLsizei n, const GLuint *textures)) { + // Remove Old Data + for (int i = 0; i < n; i++) { + GLint id = textures[n]; + std::vector::iterator it = get_texture_data().begin(); + while (it != get_texture_data().end()) { + texture_data data = *it; + if (data.id == id) { + it = get_texture_data().erase(it); + } else { + ++it; + } + } + } + + // Call Original Method + ensure_glDeleteTextures(); + (*real_glDeleteTextures)(n, textures); +} +static void get_texture_size(GLint id, GLsizei *width, GLsizei *height) { + // Iterate + std::vector::iterator it = get_texture_data().begin(); + while (it != get_texture_data().end()) { + texture_data data = *it; + if (data.id == id) { + // Found + *width = data.width; + *height = data.height; + return; + } + ++it; + } + // Not Found + ERR("Unable To Find Size Of Texture: %i", id); +} + +// Scale Texture (Remember To Free) +#define PIXEL_SIZE 4 +static int get_line_size(int width) { + int line_size = width * PIXEL_SIZE; + { + // Handle Alignment + int alignment; + glGetIntegerv(GL_UNPACK_ALIGNMENT, &alignment); + // Round + int diff = line_size % alignment; + if (diff > 0) { + line_size = line_size + (alignment - diff); + } + } + return line_size; +} +static void *scale_texture(const unsigned char *src, GLsizei old_width, GLsizei old_height, GLsizei new_width, GLsizei new_height) { + int old_line_size = get_line_size(old_width); + int new_line_size = get_line_size(new_width); + + // Allocate + unsigned char *dst = (unsigned char *) malloc(new_height * new_line_size); + ALLOC_CHECK(dst); + + // Scale + for (int new_x = 0; new_x < new_width; new_x++) { + int old_x = (int) (((float) new_x / (float) new_width) * (float) old_width); + for (int new_y = 0; new_y < new_height; new_y++) { + int old_y = (int) (((float) new_y / (float) new_height) * (float) old_height); + + // Find Position + int new_position = (new_y * new_line_size) + (new_x * PIXEL_SIZE); + int old_position = (old_y * old_line_size) + (old_x * PIXEL_SIZE); + + // Copy + static_assert(sizeof (int32_t) == PIXEL_SIZE, "Pixel Size Doesn't Match 32-Bit Integer Size"); + *(int32_t *) &dst[new_position] = *(int32_t *) &src[old_position]; + } + } + + // Return + return dst; +} + +// Scale Animated Textures +static void Textures_tick_glTexSubImage2D_injection(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels) { + // Get Current Texture Size + GLint current_texture; + glGetIntegerv(GL_TEXTURE_BINDING_2D, ¤t_texture); + GLsizei texture_width; + GLsizei texture_height; + get_texture_size(current_texture, &texture_width, &texture_height); + + // Calculate Factor + float width_factor = ((float) texture_width) / 256.0f; + float height_factor = ((float) texture_height) / 256.0f; + + // Only Scale If Needed + if (width_factor == 1.0f && height_factor == 1.0f) { + // No Scaling + glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels); + } else { + // Check + if (format != GL_RGBA || type != GL_UNSIGNED_BYTE) { + // Pixels Must Be 4 Bytes + ERR("%s", "Unsupported Texture Format For Scaling"); + } + + // Scale + GLsizei new_width = width * width_factor; + GLsizei new_height = height * height_factor; + void *new_pixels = scale_texture((const unsigned char *) pixels, width, height, new_width, new_height); + + // Call Original Method + GLint new_xoffset = xoffset * width_factor; + GLint new_yoffset = yoffset * height_factor; + glTexSubImage2D(target, level, new_xoffset, new_yoffset, new_width, new_height, format, type, new_pixels); + + // Free + free(new_pixels); + } +} + // Init void init_textures() { // Tick Dynamic Textures (Animated Water) if (feature_has("Animated Water", 0)) { overwrite_calls((void *) Minecraft_tick, (void *) Minecraft_tick_injection); } + + // Scale Animated Textures + overwrite_call((void *) 0x53274, (void *) Textures_tick_glTexSubImage2D_injection); } diff --git a/symbols/include/symbols/minecraft.h b/symbols/include/symbols/minecraft.h index 2c89729..70ad00d 100644 --- a/symbols/include/symbols/minecraft.h +++ b/symbols/include/symbols/minecraft.h @@ -36,6 +36,9 @@ static unsigned char **Tile_topSnow = (unsigned char **) 0x181b30; static unsigned char **Tile_ice = (unsigned char **) 0x181d80; static unsigned char **Tile_invisible_bedrock = (unsigned char **) 0x181d94; static unsigned char **Tile_netherReactor = (unsigned char **) 0x181dd0; +static unsigned char **Tile_info_updateGame1 = (unsigned char **) 0x181c68; +static unsigned char **Tile_info_updateGame2 = (unsigned char **) 0x181c6c; +static unsigned char **Tile_bedrock = (unsigned char **) 0x181cc4; static unsigned char **Tile_leaves = (unsigned char **) 0x18120c; static unsigned char **Tile_leaves_carried = (unsigned char **) 0x181dd8; @@ -456,17 +459,22 @@ static RakNet_SystemAddress_ToString_t RakNet_SystemAddress_ToString = (RakNet_S // ServerSideNetworkHandler -typedef void (*ServerSideNetworkHandler_onDisconnect_t)(unsigned char *server_side_network_handler, unsigned char *guid); +typedef void (*ServerSideNetworkHandler_onDisconnect_t)(unsigned char *server_side_network_handler, struct RakNet_RakNetGUID *guid); static ServerSideNetworkHandler_onDisconnect_t ServerSideNetworkHandler_onDisconnect = (ServerSideNetworkHandler_onDisconnect_t) 0x75164; static void *ServerSideNetworkHandler_onDisconnect_vtable_addr = (void *) 0x109bb0; -typedef unsigned char *(*ServerSideNetworkHandler_getPlayer_t)(unsigned char *server_side_network_handler, unsigned char *guid); +typedef unsigned char *(*ServerSideNetworkHandler_getPlayer_t)(unsigned char *server_side_network_handler, struct RakNet_RakNetGUID *guid); static ServerSideNetworkHandler_getPlayer_t ServerSideNetworkHandler_getPlayer = (ServerSideNetworkHandler_getPlayer_t) 0x75464; -typedef void (*ServerSideNetworkHandler_handle_t)(unsigned char *server_side_network_handler, unsigned char *rak_net_guid, unsigned char *packet); +typedef unsigned char *(*ServerSideNetworkHandler_popPendingPlayer_t)(unsigned char *server_side_network_handler, struct RakNet_RakNetGUID *guid); +static ServerSideNetworkHandler_popPendingPlayer_t ServerSideNetworkHandler_popPendingPlayer = (ServerSideNetworkHandler_popPendingPlayer_t) 0x75db4; + +typedef void (*ServerSideNetworkHandler_handle_t)(unsigned char *server_side_network_handler, struct RakNet_RakNetGUID *rak_net_guid, unsigned char *packet); static void *ServerSideNetworkHandler_handle_ChatPacket_vtable_addr = (void *) 0x109c60; +static uint32_t ServerSideNetworkHandler_minecraft_property_offset = 0x8; // Minecraft * + // Inventory typedef void (*Inventory_selectSlot_t)(unsigned char *inventory, int32_t slot);