From bd0d762df5576374c39f3b256168d1d756369b1a Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 23 Dec 2018 21:14:48 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0=20NBT=20=D0=B2=20=D1=87=D0=B0=D0=BD=D0=BA=D0=B0?= =?UTF-8?q?=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/mc/world/anvil/AnvilBlock.java | 15 +++++ .../main/java/mc/world/anvil/AnvilChunk.java | 14 +++++ .../test/java/mc/world/anvil/RegionTest.java | 31 ++++++++++ .../src/test/resources/region/r.0.0.mca | Bin 700416 -> 700416 bytes .../java/mc/core/network/NetInputStream.java | 2 + .../java/mc/core/network/NetOutputStream.java | 3 + .../main/java/mc/core/world/block/Block.java | 9 +++ .../java/mc/core/world/block/BlockType.java | 17 ++++-- .../proto_1_12_2/NetInputStream_p340.java | 24 ++++++++ .../proto_1_12_2/NetOutputStream_p340.java | 23 ++++++++ .../proto_1_12_2/packets/ChunkDataPacket.java | 21 ++++++- .../packets/ChunkDataPacketTest.java | 54 +++++++++++++++--- .../proto_1_12_2/packets/DumbChunkData.java | 13 ++++- .../proto_1_12_2/packets/ChunkDataPacket.bin | Bin 12574 -> 13182 bytes 14 files changed, 209 insertions(+), 17 deletions(-) diff --git a/anvil-loader/src/main/java/mc/world/anvil/AnvilBlock.java b/anvil-loader/src/main/java/mc/world/anvil/AnvilBlock.java index a445b0f..730b7a4 100644 --- a/anvil-loader/src/main/java/mc/world/anvil/AnvilBlock.java +++ b/anvil-loader/src/main/java/mc/world/anvil/AnvilBlock.java @@ -1,5 +1,6 @@ package mc.world.anvil; +import com.flowpowered.nbt.CompoundTag; import lombok.extern.slf4j.Slf4j; import mc.core.world.block.Block; import mc.core.world.block.BlockLocation; @@ -49,6 +50,20 @@ public class AnvilBlock implements Block { return globalLocation; } + @Override + public CompoundTag getNBTData() { + CompoundTag compoundTag = chunkSection.getParent().getNbtByGlobalXYZ( + (chunkSection.getX() << 4) + location.getX(), + (chunkSection.getY() << 4) + location.getY(), + (chunkSection.getZ() << 4) + location.getZ() + ); + + compoundTag.getValue().remove("Items"); + compoundTag.getValue().remove("Lock"); + + return compoundTag; + } + @Override public String toString() { return "AnvilBlock{" + diff --git a/anvil-loader/src/main/java/mc/world/anvil/AnvilChunk.java b/anvil-loader/src/main/java/mc/world/anvil/AnvilChunk.java index 877d648..5207948 100644 --- a/anvil-loader/src/main/java/mc/world/anvil/AnvilChunk.java +++ b/anvil-loader/src/main/java/mc/world/anvil/AnvilChunk.java @@ -20,6 +20,7 @@ public class AnvilChunk implements Chunk { private int z; private TByteList biomes = new TByteArrayList(256); private List sections; + private ListTag tileEntities; @SuppressWarnings("unchecked") AnvilChunk(CompoundTag chunkTag) { @@ -29,6 +30,7 @@ public class AnvilChunk implements Chunk { this.z = ((IntTag) levelTagMap.get("zPos")).getValue(); biomes.add(((ByteArrayTag) levelTagMap.get("Biomes")).getValue()); + tileEntities = (ListTag) levelTagMap.get("TileEntities"); List sections = ((ListTag) levelTagMap.get("Sections")).getValue(); this.sections = new ArrayList<>(sections.size()); @@ -49,6 +51,18 @@ public class AnvilChunk implements Chunk { } } + CompoundTag getNbtByGlobalXYZ(int x, int y, int z) { + for (CompoundTag compoundTag : tileEntities.getValue()) { + CompoundMap compoundMap = compoundTag.getValue(); + if (((IntTag)compoundMap.get("x")).getValue() == x + && ((IntTag)compoundMap.get("y")).getValue() == y + && ((IntTag)compoundMap.get("z")).getValue() == z) { + return compoundTag; + } + } + return null; + } + @Override public ChunkSection getChunkSection(int height) { if (height > sections.size()-1) return null; diff --git a/anvil-loader/src/test/java/mc/world/anvil/RegionTest.java b/anvil-loader/src/test/java/mc/world/anvil/RegionTest.java index 6169964..922711f 100644 --- a/anvil-loader/src/test/java/mc/world/anvil/RegionTest.java +++ b/anvil-loader/src/test/java/mc/world/anvil/RegionTest.java @@ -1,5 +1,9 @@ package mc.world.anvil; +import com.flowpowered.nbt.CompoundMap; +import com.flowpowered.nbt.CompoundTag; +import com.flowpowered.nbt.IntTag; +import com.flowpowered.nbt.StringTag; import lombok.SneakyThrows; import mc.core.world.block.Block; import mc.core.world.block.BlockType; @@ -60,6 +64,16 @@ class RegionTest { } } + private CompoundTag createExceptedNBT(Block block) { + CompoundMap compoundMap = new CompoundMap(); + compoundMap.put(new IntTag("x", block.getLocation().getX())); + compoundMap.put(new IntTag("y", block.getLocation().getY())); + compoundMap.put(new IntTag("z", block.getLocation().getZ())); + compoundMap.put(new StringTag("id", block.getBlockType().getNamedId())); + + return new CompoundTag("", compoundMap); + } + private void checkSection2(ChunkSection chunkSection) { for (int y = 0; y < 16; y++) { for (int x = 0; x < 16; x++) { @@ -70,6 +84,23 @@ class RegionTest { // @formatter:off if (y == 0) assertEquals(BlockType.DIRT, block.getBlockType(), msg); else if (y == 1) assertEquals(BlockType.GRASS, block.getBlockType(), msg); + else if (y == 2) { + if ((x == 2 || x == 4 || x == 5) && z == 1) { + assertEquals(BlockType.CHEST_NORTH, block.getBlockType(), msg); + assertEquals(createExceptedNBT(block), block.getNBTData()); + } else if ((x == 2 || x == 3 || x == 5) && z == 6) { + assertEquals(BlockType.CHEST_SOUTH, block.getBlockType(), msg); + assertEquals(createExceptedNBT(block), block.getNBTData()); + } else if (x == 1 && (z == 2 || z == 3 || z == 5)) { + assertEquals(BlockType.CHEST_WEST, block.getBlockType(), msg); + assertEquals(createExceptedNBT(block), block.getNBTData()); + } else if (x == 6 && (z == 2 || z == 4 || z == 5)) { + assertEquals(BlockType.CHEST_EAST, block.getBlockType(), msg); + assertEquals(createExceptedNBT(block), block.getNBTData()); + } else { + assertEquals(BlockType.AIR, block.getBlockType(), msg); + } + } else assertEquals(BlockType.AIR, block.getBlockType(), msg); // @formatter:on } diff --git a/anvil-loader/src/test/resources/region/r.0.0.mca b/anvil-loader/src/test/resources/region/r.0.0.mca index 214dbf0d26406f74a49d25c038b3e0464e3d6e1d..7052a51874cb5fc4ce1f512210069687069624cd 100644 GIT binary patch delta 14920 zcmcgz2{@GP_nw*8GDHoMwa8kOW#+RbOJ&KDNOnTDER{7Bp;XEiVo>6<@5-JcNo32e zRZ*WxX;DebSN_lY&I~j0m2dg~x~{n{|61754ZiMHt<2868iv;h~_EWz6<2!OovKL8)feYc)Q7(Q4{!e`o{PXMr;0q}q z!oQ>#3xA3FCX}1ax*xuf@?~UY;Ae{23%$e3dI5I5n<=CW6L9X;nPKK5>bPUw@u_N@ z^+tm9^bDJaz9ns0nlJf!MQ?vi5}V4=!~Q3f%v?s6gyHsW_Lrbv!DPE6q424x?v_i* zje)tk&|6_Ts~4q*?xHZl!ot@@Lqjqm?M+_#AHa$2IO~vLlw#3g5$Wpq;1BVf=FS7v@h{VlLY;UiS7SbT{V&SjZCmJiEqMboP4CB| zUNcK4#}Y6b(FK1HQuL9SjWc8;?M;7#;0gg9kGbj0tv zh~HJWi!=3X! z2Uhl)S_b}puQs+eS5CD|5jccr&LO7_L&~Y5D>f%lO|z^gf#jXx*^T-DHmW=0(XjpT zONx*!itg?1gF8m;*xsusoGe^*Oy-O|%XHcrRzc>`Hw7uHH0c$&xw)T9t2&F<@tE!i zsfZL@aqnDFXKI#BT+v!FK2y>07H)%XFIlyl*4B6BQ{~3u>%>YNZA%=rmnN+ptg`#; zb0K!k*pUN$7wr3NK8M_Wh^=XgSTcC;Fx}gsPpDE>d`9KJBX=BF4VpF zUCDemzmJyt-n;meH=jayAUa8>!8i%y5IRq;0Cevyg0TtVGkF2vM32z1Dc5g`B^m8^ zb?h`$M*<=-c9ktK5Ov;Q31Y)t+x~o0PUFT=D|=&`M|!Snxr77CcJkF45Vw!e3Fww) zCUHdFE|$cX$Tp`xv9C5ecI5)Wy@hj%=o=q=AfA^`j#5^8udar-VZuq>d(?7I4NBxH5h`EPR-Wt;84^NSL808{a|T zoZS)9Dd>eUR`X4+vzz8ZaAmQgSK)c!<<8(bNStnSfb4KSF1aPBZEt3g`|9;hO<`ZR zR-#9=vGO14UOUobKYaM$OGIUWn42hqJ<5r9c8!S|&` zEFs&E&4WDA>d3Cp!Mj4_9-%W6&|ELhU1nkCXz384)_UEej5*NWWhhGW#aYC=(Zm=- ztO&!o0^mOrivJLxN$*Ktz;*nRIP=_{x8n!9uc4jSa#b29txp(lpXqq5RhekID_{P# zaOl+*#^MwBcEWOH%KbtvQlm@um~AiLhc%m)FXzTuOj|8g%DDV^ADc?ByHGFTxxat1 zz0|EnF3jpH;pca5Fc%4u)-Qaay_RJxxiL5o$zF%t^0bYhrCM5A$MsM%8Vc8SU+h1? zCbs#kPnwmFucWu!b>HiSLc_e*c@(9dGFn7PTFF;9TN^#fPMj!8@R+bmG3v)A0ep-g zNV$r$@`()-XNa$&_ee(78fLxHM(vMYM%)JD<9dqudCbM=x`+Av^g#tM;XB;qOOclsaJFmg2$j!sUBc=M(rJY5x z;ObpX+>*Uge*3z5OKwiF^sg^E?Q--)7cTdXPFWS88j$De|lT%;xHngcKx3yp* zqf)iXzid!cKj)=m&M3|lj>Rh^$~>suKanYUNzl2?tpSxCNb!%%FknM1cLYT9;l z=(Y_pm3i4bQyczFpV+6t=Q@_c`$QGbdhF&6Q+%I5vZk)Jh| z3UNt}4Hfu>W2ua#g<_Ji3;31B*vG#0O?)RR>F`|yE{d_gEVX`~mNkD-YAq@)i~l?= zm$KmdS2E!n8p$>@&i5?^PXF4svw`qeLHi5e9-kkxG`>Xwq2v%m6|^B25LmsB6cE!R zqSBn-jBrRx@b%1zjTteD#u~Pdk~KfD);*MWQF{eRVuS*ih6|P_iwCXOFHE&s%Q^FHr0b5Sw%+OGxh%FL(0)^*N^Ljw9a&R;>vR3#NDdCVMo?aVnWvv z)+pV^H@>I1IRt$dUciIlQ}@)DH%<~h%LrWF>tvg8VY}g)fZkn|XI9kN+1u~^o#=XQ zXw$Z4{f^fSLCPm}d$~TsM%0x)#tN=Ed6NT!rkE44-IJ8N zM{1a*W4_g*Q0gx(HJVOkJo4JrIvgCx;wW=xeBZw6Fa9;3pMCMGK2(E-Z_CdycvSf? zgzDMkHx-hRc@T#}Jup_mzPZA*U$e>Y0k($Np~t)mjfzzl9G5AYcy>dv;$T&Nz%JtQ zRPWNFr!yy3a@|ab+#MfGFpbrAZg{BktSp$R^fp(3NuR*@7@lzB(aWo1-W%|QZ@*t? z;T^VqJ~_bUXH)k2adf1M)Wf>xqU^iORrY&d(n)b?+4at2A9I>?#hZ^Ns=bNPqTETJ z2Zpa2Jg$n*500KnNVxqdSuJQoug5I%q;a1 zntW<)nHJV?ZXkVk!*eI6_NJUe!XYSqUWV&no5hw^K@cl0B*WBAbGF@jl^65}l*aaB zaeEGh9ntj7vbN)$6s@=@Rd%WJ3^U_v;UR`lfu=`>KErM7xaZ^J<5H?{aXZw01vC`# zEvwoq<+ZJh-mhlR8=_BX;m&+go9tmCw%z)y+~{Kh`}r!zHzkh8);6yDy)eG`@Y0X6 z28wxA<4#@ z+r_=DmnoRd-4d*VF}R6>v{jnq+>M^?hh*69oqPEpHOmV0Lw~YTa(A+TNe`~JA&4XkhQvHh*aq4EeY*ndtSL|)# zU87bXj5+an)7ZQATg7XM19IacU)@CcnARB=y0^V}HiD`+v*g~|j-)o*O)0!VQpPZcK@e-$Tx%BhCv zg511f8^wI2$a~ZiOXLbgE1+oz1xiuNcq#{GPnc*fK}d)TjAlBVKaVTsh2qM|U-+J` zr1VZcxOIC1`QHG&0tfl_%;YkX+=3-h;|3LDv==Z&G&IdBK+`xhi~*Xa9;Ru+r*#pU z=D>%PRkJ-!f2jt+M{$spBdAC+M z6sD=`x8C9#Kfhh7_a>x_{P-z^Tt*^2Jt!k{a`0_Gu^t@2c_b6X`q|270qfB+5x9xx z1eKf2B-BHTY1df}wFgz4kV$GeU)Y(FWnt7ItK~i#L^to zqaB6kTVMU>RdQwNMy@P_v_WC%e3>v!_CEtBb*n}y<2P^rRaps4%}-n9_)3U@f#Ew5 z)sHw@_3oDBtq$A$UU&AEjJF`SzxWQ3Os>of6H3yVG5qhkR%SQL-r%;-8E&YrD*lL|77G5dMb@@doZ^B}?0CCw%nyhrkf8d8Gc4a~N@ zAA3h{$rV)ZZv-PNvi(@97JII{GDJuT#;{_TlsHCNY7Rt)qdgW+EeqzjqNxU$c0q_# z*EwdQl`*Jx_3&Db-b4t)d<_$TbyeYE%} zRMFBSRpl=<5)0HYwR%@jCyDrO;u^{l$T0cuE7g%3*qQ;G>2fq3(*8$`sB>K}9C|Y$ zq?;|@DpvFKxunGTM%#;pTm4&bQ0om3Gp=`?L&ZD_X6bQ3PNH9*i}GRD;oYp-rn;}K z&gCIi7J&Z$+sYZ~>zl45X`Rm>{3vXC8(5z-Nmyr?j&G*y7D%XcfM7h$7D5|kB>tMp z?cyj*0Ne0du4K)iE|204E2;Hxj73$UWw4|B3ogBOVnPTZE`cYI%{qh-!s$4~I$53t zgb>0n9zoo04fw?bm(s3O&q=@sxwWZUwtd084=>ae1BB3>R*}(j2y2WGLgDVNV<%yT z?rl;4`Y-|Cg-<*|v3oAc)a6AwG(dv!hy}DYIHq6pLdQ?;1GM!c1P{AmJk%ml$@~(M zuJbr#$(j8J6f#RH-)*jfNp(5Z+z9+lYPJCQ1|*VsShpzOu>4PalN5mO!>5E%e3J)- zQqI+Y5zP3tOzt<9tjZMjO%P;eW(hBzUVnnW$K=8K%>Ei@wzN$%`#UE3S^mTbhH~|$ zd52jv-|lR7^6SX?eW#*lx>tey60nGr*G_=(o0{@dfH#GT0z;5;rHy0el#bHHk5dBJ`)3@!hl12NDi{ zMTvR{5@Rkf3Nw^=Q1rgyI-7?ctoP>lZ1I`Wa`e}r>Ni^sXpn&u^u z(F6%iWqi{Kf;V{u3^WDpU(0_24gc{SzY5Z+e5Agf8fZuOLJrpKUV}{DZ zZM<*=^Vt>?HSJqnoEYeY(0Buv2(5=SyR^BbW~ph%BIdx|N(eWd>Kk7lA|ff%k?$%} zRCW|<22gEEVw&4PR}yc!sz4TInj1MvIr063m20C3x|9_lK@Ng-0rDE~{u(6SzpRgz z!1Sb-L9PSGXo2gHkcH32g*|XBO#VyEdC&!V+%LAA@K~QMI5>4-62_zOrPbQ?2nho+ z#7VY&1(#ntv0{<>A9szcDuUE@v30}#u3j_WjbT@J+r*7Wt!9XcylcSuuCv5~pjfIZ z{JAc1B8%uDc;P1Ouk@o^^Z~Vd1opKJruQ1L!q5Mm(3Q>_wrq;o?ZcWV_@?=)Y~ne_}ogBEif1r6_w!|Cu;I4 zoJu;Cm9avu6Tj=b`&4qu3E0;<+MEXM_J)|FZKh7|nyV~0q*R4RE%ZJ<)E(kT7Tswg z28$@FElkgl(Ec1VLzGpog+m)ZrH%3rjQew8|M*Sj~L8C4fTs zC{hzXcoO5I0)zK_?1sW&@r_6L83g}H`}1#^U*<4P!0%WDuSEEr z62MOB+kz1Wg-oguhLT1+1lk`8^3aMcxk+FcWPULByI7Fq`dfoMpEe7IbM;3vhq-nV zABfe}t?1h!#$Ow&!G}5=ZnvfErGaUv`u6SH{h3DIjC%n6;+9mCIq#wT@)rKRB#