From c4eb62c862349be5c10e5c84b360d7ec1b0e9e40 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 7 Oct 2022 18:43:39 +0200 Subject: [PATCH 1/4] World of Tags - Tile Entities in ponder are now backed up as their nbt compound instead of a cloned instance --- .../create/foundation/ponder/PonderWorld.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java index 5193df037..cf6955e22 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java @@ -34,6 +34,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.particles.BlockParticleOption; import net.minecraft.core.particles.ParticleOptions; import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; @@ -54,7 +55,7 @@ public class PonderWorld extends SchematicWorld { public PonderScene scene; protected Map originalBlocks; - protected Map originalTileEntities; + protected Map originalTileEntities; protected Map blockBreakingProgressions; protected List originalEntities; private Supplier asClientWorld = Suppliers.memoize(() -> WrappedClientWorld.of(this)); @@ -79,8 +80,7 @@ public class PonderWorld extends SchematicWorld { originalBlocks.clear(); originalTileEntities.clear(); blocks.forEach((k, v) -> originalBlocks.put(k, v)); - tileEntities.forEach( - (k, v) -> originalTileEntities.put(k, BlockEntity.loadStatic(k, blocks.get(k), v.saveWithFullMetadata()))); + tileEntities.forEach((k, v) -> originalTileEntities.put(k, v.saveWithFullMetadata())); entities.forEach(e -> EntityType.create(e.serializeNBT(), this) .ifPresent(originalEntities::add)); } @@ -93,7 +93,7 @@ public class PonderWorld extends SchematicWorld { renderedTileEntities.clear(); originalBlocks.forEach((k, v) -> blocks.put(k, v)); originalTileEntities.forEach((k, v) -> { - BlockEntity te = BlockEntity.loadStatic(k, originalBlocks.get(k), v.saveWithFullMetadata()); + BlockEntity te = BlockEntity.loadStatic(k, originalBlocks.get(k), v); onTEadded(te, te.getBlockPos()); tileEntities.put(k, te); renderedTileEntities.add(te); @@ -109,8 +109,7 @@ public class PonderWorld extends SchematicWorld { if (originalBlocks.containsKey(p)) blocks.put(p, originalBlocks.get(p)); if (originalTileEntities.containsKey(p)) { - BlockEntity te = BlockEntity.loadStatic(p, originalBlocks.get(p), originalTileEntities.get(p) - .saveWithFullMetadata()); + BlockEntity te = BlockEntity.loadStatic(p, originalBlocks.get(p), originalTileEntities.get(p)); onTEadded(te, te.getBlockPos()); tileEntities.put(p, te); } From 7cd149ba0610e6f9d40a7ef55916a19055c52a9a Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 7 Oct 2022 19:33:10 +0200 Subject: [PATCH 2/4] Pick a side - Ponder's Identify mode now supports blocks with ray-specific pick block results --- .../create/foundation/ponder/PonderScene.java | 20 ++++++++++++------- .../ponder/element/WorldSectionElement.java | 5 +++-- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java index 3598a9492..37978e7a8 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java @@ -35,6 +35,7 @@ import com.simibubi.create.foundation.ponder.ui.PonderUI; import com.simibubi.create.foundation.render.ForcedDiffuseState; import com.simibubi.create.foundation.render.SuperRenderTypeBuffer; import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.utility.BlockFace; import com.simibubi.create.foundation.utility.Pair; import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.animation.LerpedFloat; @@ -134,14 +135,14 @@ public class PonderScene { } public Pair rayTraceScene(Vec3 from, Vec3 to) { - MutableObject> nearestHit = new MutableObject<>(); + MutableObject>> nearestHit = new MutableObject<>(); MutableDouble bestDistance = new MutableDouble(0); forEach(WorldSectionElement.class, wse -> { wse.resetSelectedBlock(); if (!wse.isVisible()) return; - Pair rayTrace = wse.rayTrace(world, from, to); + Pair rayTrace = wse.rayTrace(world, from, to); if (rayTrace == null) return; double distanceTo = rayTrace.getFirst() @@ -149,15 +150,20 @@ public class PonderScene { if (nearestHit.getValue() != null && distanceTo >= bestDistance.getValue()) return; - nearestHit.setValue(Pair.of(wse, rayTrace.getSecond())); + nearestHit.setValue(Pair.of(wse, rayTrace)); bestDistance.setValue(distanceTo); }); if (nearestHit.getValue() == null) return Pair.of(ItemStack.EMPTY, null); - BlockPos selectedPos = nearestHit.getValue() + Pair selectedHit = nearestHit.getValue() .getSecond(); + BlockPos selectedPos = selectedHit.getSecond() + .getPos(); + Direction selectedFace = selectedHit.getSecond() + .getFace(); + Vec3 selectedVec = selectedHit.getFirst(); BlockPos origin = new BlockPos(basePlateOffsetX, 0, basePlateOffsetZ); if (!world.getBounds() @@ -176,9 +182,9 @@ public class PonderScene { .getFirst() .selectBlock(selectedPos); BlockState blockState = world.getBlockState(selectedPos); - ItemStack pickBlock = blockState.getCloneItemStack( - new BlockHitResult(VecHelper.getCenterOf(selectedPos), Direction.UP, selectedPos, true), world, selectedPos, - Minecraft.getInstance().player); + ItemStack pickBlock = + blockState.getCloneItemStack(new BlockHitResult(selectedVec, selectedFace, selectedPos, true), world, + selectedPos, Minecraft.getInstance().player); return Pair.of(pickBlock, selectedPos); } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/element/WorldSectionElement.java b/src/main/java/com/simibubi/create/foundation/ponder/element/WorldSectionElement.java index f1afaeb47..19056286d 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/element/WorldSectionElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/element/WorldSectionElement.java @@ -26,6 +26,7 @@ import com.simibubi.create.foundation.render.SuperByteBufferCache; import com.simibubi.create.foundation.render.SuperRenderTypeBuffer; import com.simibubi.create.foundation.render.TileEntityRenderHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.utility.BlockFace; import com.simibubi.create.foundation.utility.Pair; import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.outliner.AABBOutline; @@ -181,7 +182,7 @@ public class WorldSectionElement extends AnimatedSceneElement { BlockPos worldPos; } - public Pair rayTrace(PonderWorld world, Vec3 source, Vec3 target) { + public Pair rayTrace(PonderWorld world, Vec3 source, Vec3 target) { world.setMask(this.section); Vec3 transformedTarget = reverseTransformVec(target); BlockHitResult rayTraceBlocks = world.clip(new ClipContext(reverseTransformVec(source), transformedTarget, @@ -199,7 +200,7 @@ public class WorldSectionElement extends AnimatedSceneElement { / source.subtract(target) .lengthSqr(); Vec3 actualHit = VecHelper.lerp((float) t, target, source); - return Pair.of(actualHit, rayTraceBlocks.getBlockPos()); + return Pair.of(actualHit, new BlockFace(rayTraceBlocks.getBlockPos(), rayTraceBlocks.getDirection())); } private Vec3 reverseTransformVec(Vec3 in) { From 959aa4afbdc49bebb876b46654919797fd8ebc8f Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 7 Oct 2022 19:47:22 +0200 Subject: [PATCH 3/4] Pick a better side - Pass local coordinates to blocks when calling pick() in identify mode --- .../create/foundation/ponder/PonderScene.java | 23 ++++++++++--------- .../ponder/element/WorldSectionElement.java | 5 ++-- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java index 37978e7a8..731838dc7 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java @@ -35,7 +35,6 @@ import com.simibubi.create.foundation.ponder.ui.PonderUI; import com.simibubi.create.foundation.render.ForcedDiffuseState; import com.simibubi.create.foundation.render.SuperRenderTypeBuffer; import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.BlockFace; import com.simibubi.create.foundation.utility.Pair; import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.animation.LerpedFloat; @@ -135,14 +134,14 @@ public class PonderScene { } public Pair rayTraceScene(Vec3 from, Vec3 to) { - MutableObject>> nearestHit = new MutableObject<>(); + MutableObject>> nearestHit = new MutableObject<>(); MutableDouble bestDistance = new MutableDouble(0); forEach(WorldSectionElement.class, wse -> { wse.resetSelectedBlock(); if (!wse.isVisible()) return; - Pair rayTrace = wse.rayTrace(world, from, to); + Pair rayTrace = wse.rayTrace(world, from, to); if (rayTrace == null) return; double distanceTo = rayTrace.getFirst() @@ -157,13 +156,10 @@ public class PonderScene { if (nearestHit.getValue() == null) return Pair.of(ItemStack.EMPTY, null); - Pair selectedHit = nearestHit.getValue() + Pair selectedHit = nearestHit.getValue() .getSecond(); BlockPos selectedPos = selectedHit.getSecond() - .getPos(); - Direction selectedFace = selectedHit.getSecond() - .getFace(); - Vec3 selectedVec = selectedHit.getFirst(); + .getBlockPos(); BlockPos origin = new BlockPos(basePlateOffsetX, 0, basePlateOffsetZ); if (!world.getBounds() @@ -182,9 +178,14 @@ public class PonderScene { .getFirst() .selectBlock(selectedPos); BlockState blockState = world.getBlockState(selectedPos); - ItemStack pickBlock = - blockState.getCloneItemStack(new BlockHitResult(selectedVec, selectedFace, selectedPos, true), world, - selectedPos, Minecraft.getInstance().player); + + Direction direction = selectedHit.getSecond() + .getDirection(); + Vec3 location = selectedHit.getSecond() + .getLocation(); + + ItemStack pickBlock = blockState.getCloneItemStack(new BlockHitResult(location, direction, selectedPos, true), + world, selectedPos, Minecraft.getInstance().player); return Pair.of(pickBlock, selectedPos); } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/element/WorldSectionElement.java b/src/main/java/com/simibubi/create/foundation/ponder/element/WorldSectionElement.java index 19056286d..a4bfb3537 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/element/WorldSectionElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/element/WorldSectionElement.java @@ -26,7 +26,6 @@ import com.simibubi.create.foundation.render.SuperByteBufferCache; import com.simibubi.create.foundation.render.SuperRenderTypeBuffer; import com.simibubi.create.foundation.render.TileEntityRenderHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.BlockFace; import com.simibubi.create.foundation.utility.Pair; import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.outliner.AABBOutline; @@ -182,7 +181,7 @@ public class WorldSectionElement extends AnimatedSceneElement { BlockPos worldPos; } - public Pair rayTrace(PonderWorld world, Vec3 source, Vec3 target) { + public Pair rayTrace(PonderWorld world, Vec3 source, Vec3 target) { world.setMask(this.section); Vec3 transformedTarget = reverseTransformVec(target); BlockHitResult rayTraceBlocks = world.clip(new ClipContext(reverseTransformVec(source), transformedTarget, @@ -200,7 +199,7 @@ public class WorldSectionElement extends AnimatedSceneElement { / source.subtract(target) .lengthSqr(); Vec3 actualHit = VecHelper.lerp((float) t, target, source); - return Pair.of(actualHit, new BlockFace(rayTraceBlocks.getBlockPos(), rayTraceBlocks.getDirection())); + return Pair.of(actualHit, rayTraceBlocks); } private Vec3 reverseTransformVec(Vec3 in) { From 0c5ccf38ee15f446f385290f2238f2ae975681cd Mon Sep 17 00:00:00 2001 From: caelwarner Date: Sat, 8 Oct 2022 02:01:54 -0700 Subject: [PATCH 4/4] Added server-side check to BackTankUtil - Added server-side check to BackTankUtil#isBarVisible, BackTankUtil#getBarWidth, BackTankUtil#getBarColor - Fixes #3751 --- .../content/curiosities/armor/BackTankUtil.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/curiosities/armor/BackTankUtil.java b/src/main/java/com/simibubi/create/content/curiosities/armor/BackTankUtil.java index ed12b472b..70cd85197 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/armor/BackTankUtil.java +++ b/src/main/java/com/simibubi/create/content/curiosities/armor/BackTankUtil.java @@ -9,7 +9,6 @@ import com.simibubi.create.foundation.utility.Lang; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; -import net.minecraft.client.player.LocalPlayer; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.protocol.game.ClientboundSetSubtitleTextPacket; @@ -22,7 +21,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fml.DistExecutor; public class BackTankUtil { @@ -105,11 +104,10 @@ public class BackTankUtil { // For Air-using tools - @OnlyIn(Dist.CLIENT) public static boolean isBarVisible(ItemStack stack, int usesPerTank) { if (usesPerTank == 0) return false; - LocalPlayer player = Minecraft.getInstance().player; + Player player = DistExecutor.unsafeCallWhenOn(Dist.CLIENT, () -> () -> Minecraft.getInstance().player); if (player == null) return false; ItemStack backtank = get(player); @@ -118,11 +116,10 @@ public class BackTankUtil { return true; } - @OnlyIn(Dist.CLIENT) public static int getBarWidth(ItemStack stack, int usesPerTank) { if (usesPerTank == 0) return 13; - LocalPlayer player = Minecraft.getInstance().player; + Player player = DistExecutor.unsafeCallWhenOn(Dist.CLIENT, () -> () -> Minecraft.getInstance().player); if (player == null) return 13; ItemStack backtank = get(player); @@ -132,11 +129,10 @@ public class BackTankUtil { .getBarWidth(backtank); } - @OnlyIn(Dist.CLIENT) public static int getBarColor(ItemStack stack, int usesPerTank) { if (usesPerTank == 0) return 0; - LocalPlayer player = Minecraft.getInstance().player; + Player player = DistExecutor.unsafeCallWhenOn(Dist.CLIENT, () -> () -> Minecraft.getInstance().player); if (player == null) return 0; ItemStack backtank = get(player);