From 1801302d8fc412a818c487b3d8f782c85dccb992 Mon Sep 17 00:00:00 2001 From: shartte Date: Mon, 3 Aug 2020 14:46:23 +0200 Subject: [PATCH 1/2] Fix SkyStone chest model issues that I had introduced back in 1.8. (#4542) This makes the chest 1 pixel higher to restore the look it had in 1.7. Since the skystone chest's texture is a grungy mess, only the most obvious texture problems were fixed, while for the skystone block chest, the look should be close to what it was now. Also introduces caching for the skystone chest's block shape. --- .../appeng/block/storage/SkyChestBlock.java | 49 +++++---- .../client/render/tesr/SkyChestTESR.java | 4 +- .../models/item/sky_stone_chest.json | 97 +++++++----------- .../textures/models/skyblockchest.png | Bin 4734 -> 2172 bytes .../textures/models/skychest.png | Bin 2431 -> 2773 bytes 5 files changed, 67 insertions(+), 83 deletions(-) diff --git a/src/main/java/appeng/block/storage/SkyChestBlock.java b/src/main/java/appeng/block/storage/SkyChestBlock.java index 7c3d1ebab..4a0bdf94a 100644 --- a/src/main/java/appeng/block/storage/SkyChestBlock.java +++ b/src/main/java/appeng/block/storage/SkyChestBlock.java @@ -18,6 +18,9 @@ package appeng.block.storage; +import java.util.EnumMap; +import java.util.Map; + import javax.annotation.Nullable; import net.minecraft.block.BlockRenderType; @@ -47,7 +50,18 @@ public class SkyChestBlock extends AEBaseTileBlock { private static final double AABB_OFFSET_BOTTOM = 0.00; private static final double AABB_OFFSET_SIDES = 0.06; - private static final double AABB_OFFSET_TOP = 0.125; + private static final double AABB_OFFSET_TOP = 0.0625; + + // Precomputed bounding boxes of the chest, sorted into the map by the UP + // direction + private static final Map SHAPES = new EnumMap<>(Direction.class); + + static { + for (Direction up : Direction.values()) { + AxisAlignedBB aabb = computeAABB(up); + SHAPES.put(up, VoxelShapes.create(aabb)); + } + } public enum SkyChestType { STONE, BLOCK @@ -87,37 +101,30 @@ public class SkyChestBlock extends AEBaseTileBlock { @Override public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { - // TODO Cache this! It can't be that hard! - AxisAlignedBB aabb = computeAABB(worldIn, pos); - return VoxelShapes.create(aabb); + final SkyChestTileEntity sk = this.getTileEntity(worldIn, pos); + Direction up = sk != null ? sk.getUp() : Direction.UP; + return SHAPES.get(up); } - private AxisAlignedBB computeAABB(final IBlockReader w, final BlockPos pos) { - final SkyChestTileEntity sk = this.getTileEntity(w, pos); - Direction o = Direction.UP; - - if (sk != null) { - o = sk.getUp(); - } - - final double offsetX = o.getXOffset() == 0 ? AABB_OFFSET_SIDES : 0.0; - final double offsetY = o.getYOffset() == 0 ? AABB_OFFSET_SIDES : 0.0; - final double offsetZ = o.getZOffset() == 0 ? AABB_OFFSET_SIDES : 0.0; + private static AxisAlignedBB computeAABB(Direction up) { + final double offsetX = up.getXOffset() == 0 ? AABB_OFFSET_SIDES : 0.0; + final double offsetY = up.getYOffset() == 0 ? AABB_OFFSET_SIDES : 0.0; + final double offsetZ = up.getZOffset() == 0 ? AABB_OFFSET_SIDES : 0.0; // for x/z top and bottom is swapped final double minX = Math.max(0.0, - offsetX + (o.getXOffset() < 0 ? AABB_OFFSET_BOTTOM : (o.getXOffset() * AABB_OFFSET_TOP))); + offsetX + (up.getXOffset() < 0 ? AABB_OFFSET_BOTTOM : (up.getXOffset() * AABB_OFFSET_TOP))); final double minY = Math.max(0.0, - offsetY + (o.getYOffset() < 0 ? AABB_OFFSET_TOP : (o.getYOffset() * AABB_OFFSET_BOTTOM))); + offsetY + (up.getYOffset() < 0 ? AABB_OFFSET_TOP : (up.getYOffset() * AABB_OFFSET_BOTTOM))); final double minZ = Math.max(0.0, - offsetZ + (o.getZOffset() < 0 ? AABB_OFFSET_BOTTOM : (o.getZOffset() * AABB_OFFSET_TOP))); + offsetZ + (up.getZOffset() < 0 ? AABB_OFFSET_BOTTOM : (up.getZOffset() * AABB_OFFSET_TOP))); final double maxX = Math.min(1.0, - 1.0 - offsetX - (o.getXOffset() < 0 ? AABB_OFFSET_TOP : (o.getXOffset() * AABB_OFFSET_BOTTOM))); + 1.0 - offsetX - (up.getXOffset() < 0 ? AABB_OFFSET_TOP : (up.getXOffset() * AABB_OFFSET_BOTTOM))); final double maxY = Math.min(1.0, - 1.0 - offsetY - (o.getYOffset() < 0 ? AABB_OFFSET_BOTTOM : (o.getYOffset() * AABB_OFFSET_TOP))); + 1.0 - offsetY - (up.getYOffset() < 0 ? AABB_OFFSET_BOTTOM : (up.getYOffset() * AABB_OFFSET_TOP))); final double maxZ = Math.min(1.0, - 1.0 - offsetZ - (o.getZOffset() < 0 ? AABB_OFFSET_TOP : (o.getZOffset() * AABB_OFFSET_BOTTOM))); + 1.0 - offsetZ - (up.getZOffset() < 0 ? AABB_OFFSET_TOP : (up.getZOffset() * AABB_OFFSET_BOTTOM))); return new AxisAlignedBB(minX, minY, minZ, maxX, maxY, maxZ); } diff --git a/src/main/java/appeng/client/render/tesr/SkyChestTESR.java b/src/main/java/appeng/client/render/tesr/SkyChestTESR.java index da7ca30bc..6f7aab0f7 100644 --- a/src/main/java/appeng/client/render/tesr/SkyChestTESR.java +++ b/src/main/java/appeng/client/render/tesr/SkyChestTESR.java @@ -60,11 +60,11 @@ public class SkyChestTESR extends TileEntityRenderer { this.singleBottom.addBox(1.0F, 0.0F, 1.0F, 14.0F, 10.0F, 14.0F, 0.0F); this.singleLid = new ModelRenderer(64, 64, 0, 0); this.singleLid.addBox(1.0F, 0.0F, 0.0F, 14.0F, 5.0F, 14.0F, 0.0F); - this.singleLid.rotationPointY = 9.0F; + this.singleLid.rotationPointY = 10.0F; this.singleLid.rotationPointZ = 1.0F; this.singleLatch = new ModelRenderer(64, 64, 0, 0); this.singleLatch.addBox(7.0F, -1.0F, 15.0F, 2.0F, 4.0F, 1.0F, 0.0F); - this.singleLatch.rotationPointY = 8.0F; + this.singleLatch.rotationPointY = 9.0F; } @Override diff --git a/src/main/resources/assets/appliedenergistics2/models/item/sky_stone_chest.json b/src/main/resources/assets/appliedenergistics2/models/item/sky_stone_chest.json index 119e44f92..e5f75d516 100644 --- a/src/main/resources/assets/appliedenergistics2/models/item/sky_stone_chest.json +++ b/src/main/resources/assets/appliedenergistics2/models/item/sky_stone_chest.json @@ -7,94 +7,71 @@ "elements": [ { "name": "Base", - "from": [1.0, 0.0, 1.0], - "to": [15.0, 10.0, 15.0], + "from": [1, 0, 1], + "to": [15, 10, 15], "shade": false, "faces": { "north": { - "texture": "#0", - "uv": [3.5, 8.25, 7, 10.75] + "uv": [3.5, 8.25, 7, 10.75], + "rotation": 180, + "texture": "#0" }, "east": { - "texture": "#0", - "uv": [0.0, 8.25, 3.5, 10.75] + "uv": [0, 8.25, 3.5, 10.75], + "rotation": 180, + "texture": "#0" }, "south": { - "texture": "#0", - "uv": [10.5, 8.25, 14, 10.75] + "uv": [10.5, 8.25, 14, 10.75], + "rotation": 180, + "texture": "#0" }, "west": { - "texture": "#0", - "uv": [7, 8.25, 10.5, 10.75] + "uv": [7, 8.25, 10.5, 10.75], + "rotation": 180, + "texture": "#0" }, - "up": { - "texture": "#0", - "uv": [3.5, 0.0, 7, 3.5] - }, - "down": { - "texture": "#0", - "uv": [7, 0.0, 10.5, 3.5] - } + "up": { "uv": [3.5, 0, 7, 3.5], "texture": "#0" }, + "down": { "uv": [7, 0, 10.5, 3.5], "texture": "#0" } } }, { "name": "Lid", - "from": [1.0, 10.0, 1.0], - "to": [15.0, 15.0, 15.0], + "from": [1, 10, 1], + "to": [15, 15, 15], "shade": false, "faces": { "north": { - "texture": "#0", - "uv": [3.5, 3.5, 7, 4.75] - }, - "east": { - "texture": "#0", - "uv": [0.0, 3.5, 3.5, 4.75] + "uv": [3.5, 3.5, 7, 4.75], + "rotation": 180, + "texture": "#0" }, + "east": { "uv": [0, 3.5, 3.5, 4.75], "rotation": 180, "texture": "#0" }, "south": { - "texture": "#0", - "uv": [10.5, 3.5, 14, 4.75] + "uv": [10.5, 3.5, 14, 4.75], + "rotation": 180, + "texture": "#0" }, "west": { - "texture": "#0", - "uv": [7, 3.5, 10.5, 4.75] + "uv": [7, 3.5, 10.5, 4.75], + "rotation": 180, + "texture": "#0" }, - "up": { - "texture": "#0", - "uv": [3.5, 0.0, 7, 3.5] - }, - "down": { - "texture": "#0", - "uv": [7, 0.0, 10.5, 3.5] - } + "up": { "uv": [7, 0, 10.5, 3.5], "rotation": 270, "texture": "#0" }, + "down": { "uv": [7, 0, 10.5, 3.5], "texture": "#0" } } }, { "name": "Knob", - "from": [7.0, 7.0, 0.0], - "to": [9.0, 11.0, 1.0], + "from": [7, 7, 0], + "to": [9, 11, 1], "shade": false, "faces": { - "north": { - "texture": "#0", - "uv": [0.25, 0.25, 0.75, 1.25] - }, - "east": { - "texture": "#0", - "uv": [0, 0.25, 0.25, 1.25] - }, - "west": { - "texture": "#0", - "uv": [0.75, 0.25, 1.5, 1.25] - }, - "up": { - "texture": "#0", - "uv": [0.25, 0.0, 0.75, 0.25] - }, - "down": { - "texture": "#0", - "uv": [0.75, 0.0, 1.5, 0.25] - } + "north": { "uv": [0.25, 0.25, 0.75, 1.25], "texture": "#0" }, + "east": { "uv": [0, 0.25, 0.25, 1.25], "texture": "#0" }, + "west": { "uv": [0.75, 0.25, 1.5, 1.25], "texture": "#0" }, + "up": { "uv": [0.25, 0, 0.75, 0.25], "texture": "#0" }, + "down": { "uv": [0.75, 0, 1.5, 0.25], "texture": "#0" } } } ] diff --git a/src/main/resources/assets/appliedenergistics2/textures/models/skyblockchest.png b/src/main/resources/assets/appliedenergistics2/textures/models/skyblockchest.png index e6b7f80e736fb53ac5e6166775a2b71cef5dac87..1bc65a687b155c4011effcd1d188a8d6f30f6f52 100644 GIT binary patch delta 2151 zcmeyT@<(8TPW?d!2EK!gJ0@noWnkdY^K@|xskrqv>U5rnrDf@tm4_UcdzY_ef&#BB$9vp zcz1uVXK`Onme6kL*#TY$C782y4;jcvGENEN^3v=v)JwQ~=SQNmCTs56*#)~}>ep^H zIOcG5>u)=T2|-PTeTy^}tZfbADwJt9Y`c4YeqvAK8m%`uIg50>r)%lvrLcVP<2q%* zq4@6E?L9U*DUodRO7CPR^JpynV8cHp=zHDl^G+NQmz38Xjr3A%aS&kXShV8%lG)Wa z?%uU+kdEZq6IE$wEHc6H&7WV|Yql=vIlQ@EEMuOTBFixe0jE3hGRJS+yzMwGH6s3g zLm1b=FEW=_H3goE4Zm(Gk^EpzbI_{-y@B8c6oH$->GPhi8 zy5jl6&$sJ$ihQ!+KPF*tZsArpfi}IZuQtiu<&qFvv9-SX<`q#K2H7@4F~t%LIMX z0}?mXWF?X{P76h4w=bTuE9to9|DccFjG`<8P6xi%PD!o&73L5q@{aRw8S5MUrnU*o zblKJ^8yt%%4Do6-Tdmla{5{r9J0+4Wba{svxWLqWN3i>WJ9p-+W_&BGa;A9g7Ttum>AB$<_U6YLiusO7>@jHz z;&KgKaQS6J5Z5_Ni|2ghuYw#n7@at#O`CSWvi#LL(IDf^n?Fb#y?0LTkU`6oOM>Ad zuKxT5e2OfedUe~qFNxH%u{m+HB;J^=_H(^}gXU3w`#%jYUuNdy<|=v$g=}hDlcheT z=6?J0${!ydGN+}b6}-D+$)Q;A``g=nhL!UkA8O@RR&LPI(YaxBUhueK&HZ-6W1bIp ztvhI0?!6)J$=gSdl;ZZ+^-ex?cW<@$>C>l~AIsTPG#u}jKi2EXR? z$-)L+&4z7x+q+GC1E;0>KVBVIYRC8P)z#G(qMSJxHC30Tr^~Ecm%SvDYwg#@JMwDt z1RlMZdPi)9W0z3!8O`m91-ZvL4huL6D9rGftLAZ8WZ!#b4yKkw4yTUSGR?mU6HC6U&|pSc3gs4@rbDJ&dK$G9dnwExHMI5&O1xA z*?QW#?D^~Ub++k)_4faBP9Ix)^WMEFFOoK6amy z+UY%A?`!Sbo1dQ>=FHjr{QUP%Q!h1c^q*&AxrI$2JJ+OT-?78({M*CB!q_$)-gQ?` zOuSy)uxIMF^FqJ#emDHh{SYng*8Y?6`uceJ6&h>TtyA)x)YyIV)vH$<)qmYBWk^2r zR3cwSTE922{zuEIRTGx2)b`3foy9%Nkj;O--CON*d#k^@tzzka%FYutWyNzx(`WAc z7ayH##kA$xg{a+o&TiuAF+5Vp%}6ATI~fITrG(& zs;bVvnNxIZ#r+P6V-igY776osl8UR9WB%Pg%AXOu;OqC(n_9MsUA&@_lUy&IeCOuD zeAPVrm1SDI6L;?1S>O2gZ`q@&2F|y~=V~#v2r&QtohyB(e%^)k?+adWESQp%{Q3^Ed3=S7-69zrNtxjj7tRDpVe1qj z8{d!n8=|A5t?vk3c5UPq*ITeI`}*?9CayQ%T1|B3I2fY-I<(+i;m=R0dn!IYI#N*n z{_f%Xbw5*ARMakY(2m`DEx=3h#4?5Y+rd%y+q3S>3_GIY*);h`?z;8z+V>W2U9O-PmW6T1G+ zx~;ymJcai{)Z!bzSdw`b<#5dmdM7SD@A<;KU%R)8^%#~|$(HY`4%)H$`nrcVH>W!v zwJu_*lKHc}`mRxc5oSgS)%S84?UW>^$)7mz7@J9*Ygz<4vMc zXBfBEonu}0@weRFi8~MNZ#Ps+@HsG}!H_YT=@?57r-ZNpR)POFfAF`~D{VVw87;`b Pz`)??>gTe~DWM4f`Zg8p literal 4734 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hE(QWTKjuBBy{?hvLGUqJakmU0qqEPb}zQ?(1vl5e?Mg>EgP<{zP$6U-ROQ zu2a7sRxi%Jw&(k^v;VeUw|lQz`~GlIyvbvLx3(rf_nY4%M1;3f6T0AWQd-kD9X5C zB7=f(YKIF$hBd>Q^I=`C3=swlB5B@7EE#U-G8lMT#JFBV&*2Bohp{DjnN#sh3w(sdU6`)JjJy| z%o3RrXF2E{s+=il)M�PV*|l=S%D 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 diff --git a/src/main/resources/assets/appliedenergistics2/textures/models/skychest.png b/src/main/resources/assets/appliedenergistics2/textures/models/skychest.png index cad859328ef768f1188f5648c805473101b6ec65..50253b6eb4875039eed0420cb7887e1b2bf4c4a0 100644 GIT binary patch delta 2748 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 T|H>E`7#KWV{an^LB{Ts51W#?Z delta 2401 zcmcaA`d?^*iWFmUkh>GZx^prw85kH?(j9#r85lP9bN@+Xov0{Y&mdLe8c`CQpH@FNsoPmMkou`XqNJZS+S((AomI7^axt*L0>^`)9 zZ1t~6{J_|DVA7NS|5bDC--@QTaCF(OTy*W<1yf_GuUme-b-ueP`PhuTReKYo*7j*m z*RD!^W9p?g`Pt*+{c00E>SvsvZ$G=)=a7ty%#6EtV~a~lQoeov?yEKRlA(2b`RViP zKYrLV-DB3=xw3*UrP>+r&rA*<8O=Ffh8JGywv z$r+P_PEI+MI{9SU*%zOJ?u&CBUzK4aXa3hw!hi3@3p?v&8*26~;6A*n*Uekxbo~iy z`)1W=n?9UAd8FibZE2D`VCSdBO1@321;P$p2G3aIaDEb#Q5>b5GxIp@TF534}_*)zuv$5K;gy}o&wp) zwG0gm?(bKdI`3F$VG|bV#E_j_draY3L2A!h%bC@-D&b4F+SD(oHxGWDRC#BmT1k$9^O-(=4ar=Qw$lh z0V`MS4!$Jx{`33$qC7&qBWw<9XY<%(i`}?bVCAlB&tpAbNb+q0*hJAy9PJ7Vl zYOD8~CP}O{Rou;7Ab;wxj7?j0cwNYnsSm8UlVx5%+EkWfxjOjXt?xDc+Afn+-u*Y* zzj}lBr1GR$YggVbO#hafl(%!m!aY|PxjmYAj8pN5@lw6pAyEt~PsGJf|8YL8c$rO# z_nKGLr;=lKU66W4)b&S)zmdLd&OB3(nVMTkQ@y>N)Gl^m_>c$L{B7 zTC6*yr@PBBa8^al#;u~PH&(fcUs~3cq|nED;+sxWrD$hl3)7{9g1olp;)`;Ej4hLo zn0Ya*+qP4Q+pgj3sr`aK-Id}eX-qp}J%7td{g0=ArCsN)tB7fhy_6>~U2$=Bbo9;o z{n^Qxxv7d8C#JD6d}y@k`0V3cTz2j9_rL!xn562Rnta5siubFGO~cL#(fe*{C*ODe znRjA-_n+d4`UjNnZ#x+w8K=Mh#7-Ier~F)uMGbf7MaXok9NQ@J?$qY>zDJ8^e7^QG zwly}YTKs~_ulU*B-J3bY96J82JNq}dF1#*eOIW?4OT>m9-)_!)#ud#_8J+BzajhxJ zzN7l^XRZG!s~kYNdMe|AMOXg5QBri-bSO7)#*NhW26=_f=TBo#I5cXoAk z{r?>K?V)!!U$dGS1onavgNn(ctD#?17nyF`eZbzne$~{6*Nwu3lpHc7wWqoNJbo=| z)j{)}+zWX0UI$-u*XX?d;MI5gC1*vo5BIw>)N`r3SG2D8?MwfpbZLKIY35pi1Fp5F zex10+I3e`fHAWSeX!Z|zJNXn!Ubw}AlXd{Rz;=*(on3BhsJ>yvP}iXHQTIAy1?O4u zQt9GMq0S!il}UZ-o{rtC=#&$i!xy7zDN^*J+)XZpxLZU4m1c)-r9sA=M=?jwyxF+UYtIlljC z6uSQS&3yjHRXPIO>(2Sd*gbcb+;{dMN3#BB`>E%}DoRboe|F!Oi+dh_g5T2Pq7_4{ zhem{G)m!!KXm*|XC-;Zeg(prA(`)^&zlHUH`3_G^(gsrqL&P%W+dtONQh#Rs_F8Sg Qz`(%Z>FVdQ&MBb@0Fd^7r2qf` From 872d8d33cbe765588d09f0e4f07b490a8c23d22e Mon Sep 17 00:00:00 2001 From: shartte Date: Mon, 3 Aug 2020 14:46:39 +0200 Subject: [PATCH 2/2] Clean up global state for cable render mode (#4539) * Clean up the global state used to hack part interaction into respecting the player's facade render mode. Make the name more indicative of what is actually happening. * Fun. --- src/main/java/appeng/client/ClientHelper.java | 6 ++-- src/main/java/appeng/core/CommonHelper.java | 12 ++++++-- src/main/java/appeng/core/api/ApiPart.java | 2 +- .../appeng/core/api/definitions/ApiItems.java | 5 ++-- .../sync/packets/PartPlacementPacket.java | 15 ++++++---- src/main/java/appeng/parts/PartPlacement.java | 11 ++++---- src/main/java/appeng/server/ServerHelper.java | 28 ++++++++++++------- 7 files changed, 50 insertions(+), 29 deletions(-) diff --git a/src/main/java/appeng/client/ClientHelper.java b/src/main/java/appeng/client/ClientHelper.java index 50d0efbb0..054428bf5 100644 --- a/src/main/java/appeng/client/ClientHelper.java +++ b/src/main/java/appeng/client/ClientHelper.java @@ -138,15 +138,15 @@ public class ClientHelper extends ServerHelper { } @Override - public CableRenderMode getRenderMode() { + public CableRenderMode getCableRenderMode() { if (Platform.isServer()) { - return super.getRenderMode(); + return super.getCableRenderMode(); } final Minecraft mc = Minecraft.getInstance(); final PlayerEntity player = mc.player; - return this.renderModeForPlayer(player); + return this.getCableRenderModeForPlayer(player); } @Override diff --git a/src/main/java/appeng/core/CommonHelper.java b/src/main/java/appeng/core/CommonHelper.java index 773612f12..f91fd7448 100644 --- a/src/main/java/appeng/core/CommonHelper.java +++ b/src/main/java/appeng/core/CommonHelper.java @@ -22,6 +22,7 @@ import java.util.List; import java.util.Random; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import net.minecraft.client.util.InputMappings; import net.minecraft.entity.player.PlayerEntity; @@ -55,11 +56,18 @@ public abstract class CommonHelper { public abstract void postInit(); - public abstract CableRenderMode getRenderMode(); + public abstract CableRenderMode getCableRenderMode(); public abstract void triggerUpdates(); - public abstract void updateRenderMode(PlayerEntity player); + /** + * Sets the player that is currently interacting with a cable or part attached + * to a cable. This will return that player's cable render mode from calls to + * {@link #getCableRenderMode()}, until another player or null is set. + * + * @param player Null to revert to the default cable render mode. + */ + public abstract void setPartInteractionPlayer(@Nullable PlayerEntity player); public abstract boolean isActionKey(@Nonnull final ActionKey key, InputMappings.Input input); diff --git a/src/main/java/appeng/core/api/ApiPart.java b/src/main/java/appeng/core/api/ApiPart.java index df9d064e1..beb541bcc 100644 --- a/src/main/java/appeng/core/api/ApiPart.java +++ b/src/main/java/appeng/core/api/ApiPart.java @@ -41,6 +41,6 @@ public class ApiPart implements IPartHelper { @Override public CableRenderMode getCableRenderMode() { - return AppEng.proxy.getRenderMode(); + return AppEng.proxy.getCableRenderMode(); } } diff --git a/src/main/java/appeng/core/api/definitions/ApiItems.java b/src/main/java/appeng/core/api/definitions/ApiItems.java index 9aac0c4a5..3ee08e5c1 100644 --- a/src/main/java/appeng/core/api/definitions/ApiItems.java +++ b/src/main/java/appeng/core/api/definitions/ApiItems.java @@ -18,13 +18,13 @@ package appeng.core.api.definitions; -import java.awt.*; import java.util.function.Consumer; import net.minecraft.entity.EntityClassification; import net.minecraft.item.Item; import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemModelsProperties; +import net.minecraft.item.Rarity; import net.minecraft.util.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -241,7 +241,8 @@ public final class ApiItems implements IItems { .features(AEFeature.NETWORK_TOOL).build(); this.cellCreative = registry.item("creative_storage_cell", CreativeStorageCellItem::new) - .props(props -> props.maxStackSize(1)).features(AEFeature.STORAGE_CELLS, AEFeature.CREATIVE).build(); + .props(props -> props.maxStackSize(1).rarity(Rarity.EPIC)) + .features(AEFeature.STORAGE_CELLS, AEFeature.CREATIVE).build(); this.viewCell = registry.item("view_cell", ViewCellItem::new).props(props -> props.maxStackSize(1)) .features(AEFeature.VIEW_CELL).build(); diff --git a/src/main/java/appeng/core/sync/packets/PartPlacementPacket.java b/src/main/java/appeng/core/sync/packets/PartPlacementPacket.java index 6ba7a1307..5b4005236 100644 --- a/src/main/java/appeng/core/sync/packets/PartPlacementPacket.java +++ b/src/main/java/appeng/core/sync/packets/PartPlacementPacket.java @@ -68,11 +68,14 @@ public class PartPlacementPacket extends BasePacket { @Override public void serverPacketData(final INetworkInfo manager, final PlayerEntity player) { final ServerPlayerEntity sender = (ServerPlayerEntity) player; - AppEng.proxy.updateRenderMode(sender); - PartPlacement.setEyeHeight(this.eyeHeight); - PartPlacement.place(sender.getHeldItem(this.hand), new BlockPos(this.x, this.y, this.z), - Direction.values()[this.face], sender, this.hand, sender.world, - PartPlacement.PlaceType.INTERACT_FIRST_PASS, 0); - AppEng.proxy.updateRenderMode(null); + AppEng.proxy.setPartInteractionPlayer(sender); + try { + PartPlacement.setEyeHeight(this.eyeHeight); + PartPlacement.place(sender.getHeldItem(this.hand), new BlockPos(this.x, this.y, this.z), + Direction.values()[this.face], sender, this.hand, sender.world, + PartPlacement.PlaceType.INTERACT_FIRST_PASS, 0); + } finally { + AppEng.proxy.setPartInteractionPlayer(null); + } } } diff --git a/src/main/java/appeng/parts/PartPlacement.java b/src/main/java/appeng/parts/PartPlacement.java index c592408d4..03c11f960 100644 --- a/src/main/java/appeng/parts/PartPlacement.java +++ b/src/main/java/appeng/parts/PartPlacement.java @@ -330,11 +330,12 @@ public class PartPlacement { } private static SelectedPart selectPart(final PlayerEntity player, final IPartHost host, final Vector3d pos) { - AppEng.proxy.updateRenderMode(player); - final SelectedPart sp = host.selectPart(pos); - AppEng.proxy.updateRenderMode(null); - - return sp; + AppEng.proxy.setPartInteractionPlayer(player); + try { + return host.selectPart(pos); + } finally { + AppEng.proxy.setPartInteractionPlayer(null); + } } public static IFacadePart isFacade(final ItemStack held, final AEPartLocation side) { diff --git a/src/main/java/appeng/server/ServerHelper.java b/src/main/java/appeng/server/ServerHelper.java index 72d37e1b4..d5654eb4d 100644 --- a/src/main/java/appeng/server/ServerHelper.java +++ b/src/main/java/appeng/server/ServerHelper.java @@ -22,6 +22,8 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; +import javax.annotation.Nullable; + import net.minecraft.client.util.InputMappings; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; @@ -46,7 +48,17 @@ import appeng.util.Platform; public class ServerHelper extends CommonHelper { - private PlayerEntity renderModeBased; + /** + * While we process a player-specific part placement/cable interaction packet, + * we need to use that player's transparent-facade mode to understand whether + * the player can see through facades or not. + *

+ * We need to use this method since the collision shape methods do not know + * about the player that the shape is being requested for, so they will call + * {@link #getCableRenderMode()} below, which then will use this field to figure + * out which player it's for. + */ + private final ThreadLocal partInteractionPlayer = new ThreadLocal<>(); @Override public World getWorld() { @@ -112,12 +124,8 @@ public class ServerHelper extends CommonHelper { } @Override - public CableRenderMode getRenderMode() { - if (this.renderModeBased == null) { - return CableRenderMode.STANDARD; - } - - return this.renderModeForPlayer(this.renderModeBased); + public CableRenderMode getCableRenderMode() { + return this.getCableRenderModeForPlayer(partInteractionPlayer.get()); } @Override @@ -126,11 +134,11 @@ public class ServerHelper extends CommonHelper { } @Override - public void updateRenderMode(final PlayerEntity player) { - this.renderModeBased = player; + public void setPartInteractionPlayer(final PlayerEntity player) { + this.partInteractionPlayer.set(player); } - protected CableRenderMode renderModeForPlayer(final PlayerEntity player) { + protected final CableRenderMode getCableRenderModeForPlayer(@Nullable final PlayerEntity player) { if (player != null) { for (int x = 0; x < PlayerInventory.getHotbarSize(); x++) { final ItemStack is = player.inventory.getStackInSlot(x);