From 59008399eadb34dbb8c975204bafdccd61eaa3bf Mon Sep 17 00:00:00 2001 From: zbx1425 Date: Sat, 23 Sep 2023 23:39:40 +0800 Subject: [PATCH] Support holding comment item in offhand --- .../data/client/ClientRayPicking.java | 3 +- .../worldcomment/data/client/Screenshot.java | 5 +- .../worldcomment/gui/CommentListScreen.java | 4 +- .../worldcomment/gui/CommentToolScreen.java | 5 +- .../worldcomment/item/CommentToolItem.java | 67 ++++++++++++------- .../render/ControlTipRenderer.java | 7 +- 6 files changed, 58 insertions(+), 33 deletions(-) diff --git a/common/src/main/java/cn/zbx1425/worldcomment/data/client/ClientRayPicking.java b/common/src/main/java/cn/zbx1425/worldcomment/data/client/ClientRayPicking.java index f9435b5..d12e447 100644 --- a/common/src/main/java/cn/zbx1425/worldcomment/data/client/ClientRayPicking.java +++ b/common/src/main/java/cn/zbx1425/worldcomment/data/client/ClientRayPicking.java @@ -3,6 +3,7 @@ import cn.zbx1425.worldcomment.Main; import cn.zbx1425.worldcomment.data.CommentEntry; import cn.zbx1425.worldcomment.data.network.ImageDownload; +import cn.zbx1425.worldcomment.item.CommentToolItem; import cn.zbx1425.worldcomment.mixin.LevelRendererAccessor; import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap; import net.minecraft.client.Minecraft; @@ -47,7 +48,7 @@ public static void tick(float partialTicks, float hitDistance) { boolean isPicked = clipPos.isPresent() && clipPos.get().distanceToSqr(pickStart) < vanillaDistSqr; for (CommentEntry comment : blockData.getValue()) { boolean isVisible = (comment.messageType - 1) >= 4 - || minecraft.player.getMainHandItem().is(Main.ITEM_COMMENT_TOOL.get()); + || CommentToolItem.Client.getHoldingCommentTool() != null; if (isVisible) { visibleComments.computeIfAbsent(comment.location, ignored -> new ArrayList<>()).add(comment); if (isPicked) { diff --git a/common/src/main/java/cn/zbx1425/worldcomment/data/client/Screenshot.java b/common/src/main/java/cn/zbx1425/worldcomment/data/client/Screenshot.java index 3859d96..75c3d1d 100644 --- a/common/src/main/java/cn/zbx1425/worldcomment/data/client/Screenshot.java +++ b/common/src/main/java/cn/zbx1425/worldcomment/data/client/Screenshot.java @@ -3,6 +3,7 @@ import cn.zbx1425.worldcomment.Main; import cn.zbx1425.worldcomment.gui.CommentListScreen; import cn.zbx1425.worldcomment.gui.CommentToolScreen; +import cn.zbx1425.worldcomment.item.CommentToolItem; import cn.zbx1425.worldcomment.render.OverlayLayer; import net.minecraft.Util; import net.minecraft.client.Minecraft; @@ -49,8 +50,8 @@ public static boolean handleKeyF2() { Minecraft minecraft = Minecraft.getInstance(); if (minecraft.player == null) return false; - ItemStack item = minecraft.player.getMainHandItem(); - if (!item.is(Main.ITEM_COMMENT_TOOL.get())) return false; + ItemStack item = CommentToolItem.Client.getHoldingCommentTool(); + if (item == null) return false; if (item.getOrCreateTag().contains("uploadJobId", Tag.TAG_LONG)) return false; if (minecraft.screen == null) { diff --git a/common/src/main/java/cn/zbx1425/worldcomment/gui/CommentListScreen.java b/common/src/main/java/cn/zbx1425/worldcomment/gui/CommentListScreen.java index 0c58f8d..3c81fda 100644 --- a/common/src/main/java/cn/zbx1425/worldcomment/gui/CommentListScreen.java +++ b/common/src/main/java/cn/zbx1425/worldcomment/gui/CommentListScreen.java @@ -6,6 +6,7 @@ import cn.zbx1425.worldcomment.data.client.ClientWorldData; import cn.zbx1425.worldcomment.data.client.ClientRayPicking; import cn.zbx1425.worldcomment.data.network.ImageDownload; +import cn.zbx1425.worldcomment.item.CommentToolItem; import cn.zbx1425.worldcomment.network.PacketCollectionRequestC2S; import cn.zbx1425.worldcomment.network.PacketEntryActionC2S; import com.mojang.blaze3d.systems.RenderSystem; @@ -345,8 +346,7 @@ public static boolean handleKeyF5() { Minecraft minecraft = Minecraft.getInstance(); if (minecraft.player == null) return false; - ItemStack item = minecraft.player.getMainHandItem(); - if (!item.is(Main.ITEM_COMMENT_TOOL.get())) return false; + if (CommentToolItem.Client.getHoldingCommentTool() == null) return false; minecraft.execute(() -> { if (minecraft.screen instanceof CommentListScreen) { diff --git a/common/src/main/java/cn/zbx1425/worldcomment/gui/CommentToolScreen.java b/common/src/main/java/cn/zbx1425/worldcomment/gui/CommentToolScreen.java index c1d19a5..783f612 100644 --- a/common/src/main/java/cn/zbx1425/worldcomment/gui/CommentToolScreen.java +++ b/common/src/main/java/cn/zbx1425/worldcomment/gui/CommentToolScreen.java @@ -3,6 +3,7 @@ import cn.zbx1425.worldcomment.Main; import cn.zbx1425.worldcomment.data.CommentEntry; import cn.zbx1425.worldcomment.data.network.SubmitDispatcher; +import cn.zbx1425.worldcomment.item.CommentToolItem; import com.mojang.blaze3d.platform.NativeImage; import com.mojang.datafixers.types.templates.Check; import net.minecraft.ChatFormatting; @@ -208,8 +209,8 @@ private void sendReport() { )); Minecraft.getInstance().player.displayClientMessage( Component.translatable("gui.worldcomment.send_pending"), false); - ItemStack item = Minecraft.getInstance().player.getMainHandItem(); - if (item.is(Main.ITEM_COMMENT_TOOL.get())) { + ItemStack item = CommentToolItem.Client.getHoldingCommentTool(); + if (item != null) { item.getOrCreateTag().putLong("uploadJobId", jobId); } }); diff --git a/common/src/main/java/cn/zbx1425/worldcomment/item/CommentToolItem.java b/common/src/main/java/cn/zbx1425/worldcomment/item/CommentToolItem.java index db4111c..34398e3 100644 --- a/common/src/main/java/cn/zbx1425/worldcomment/item/CommentToolItem.java +++ b/common/src/main/java/cn/zbx1425/worldcomment/item/CommentToolItem.java @@ -35,36 +35,55 @@ public CommentToolItem() { if (!level.isClientSide) return InteractionResultHolder.pass(item); if (!item.is(Main.ITEM_COMMENT_TOOL.get())) return InteractionResultHolder.fail(item); - if (item.getOrCreateTag().contains("uploadJobId", Tag.TAG_LONG)) { - long jobId = item.getOrCreateTag().getLong("uploadJobId"); - HitResult hitResult = Minecraft.getInstance().hitResult; - if (hitResult != null && hitResult.getType() == HitResult.Type.BLOCK) { - BlockHitResult blockHitResult = (BlockHitResult) hitResult; - BlockPos facePos = blockHitResult.getBlockPos().relative(blockHitResult.getDirection()); - boolean hasClearance = true; - for (int y = 0; y < 3; y++) { - if (level.getBlockState(facePos.offset(0, y, 0)).isSolid()) { - hasClearance = false; - break; - } - } - if (hasClearance) { - SubmitDispatcher.placeJobAt(jobId, facePos); - item.getOrCreateTag().remove("uploadJobId"); - return InteractionResultHolder.success(item); - } else { - player.displayClientMessage( - Component.translatable("gui.worldcomment.send_insufficient_clearance"), false); - } - } + if (Client.placeUploadJob(level, player, item)) { + return InteractionResultHolder.success(item); } else { - + return InteractionResultHolder.fail(item); } - return InteractionResultHolder.fail(item); } @Override public @NotNull InteractionResult useOn(UseOnContext context) { return super.useOn(context); } + + public static class Client { + + public static ItemStack getHoldingCommentTool() { + Player player = Minecraft.getInstance().player; + if (player == null) return null; + ItemStack mainHandStack = player.getMainHandItem(); + if (mainHandStack.is(Main.ITEM_COMMENT_TOOL.get())) return mainHandStack; + ItemStack offHandStack = player.getOffhandItem(); + if (offHandStack.is(Main.ITEM_COMMENT_TOOL.get())) return offHandStack; + return null; + } + + public static boolean placeUploadJob(Level level, Player player, ItemStack item) { + if (item.getOrCreateTag().contains("uploadJobId", Tag.TAG_LONG)) { + long jobId = item.getOrCreateTag().getLong("uploadJobId"); + HitResult hitResult = Minecraft.getInstance().hitResult; + if (hitResult != null && hitResult.getType() == HitResult.Type.BLOCK) { + BlockHitResult blockHitResult = (BlockHitResult) hitResult; + BlockPos facePos = blockHitResult.getBlockPos().relative(blockHitResult.getDirection()); + boolean hasClearance = true; + for (int y = 0; y < 3; y++) { + if (level.getBlockState(facePos.offset(0, y, 0)).isSolid()) { + hasClearance = false; + break; + } + } + if (hasClearance) { + SubmitDispatcher.placeJobAt(jobId, facePos); + item.getOrCreateTag().remove("uploadJobId"); + return true; + } else { + player.displayClientMessage( + Component.translatable("gui.worldcomment.send_insufficient_clearance"), false); + } + } + } + return false; + } + } } diff --git a/common/src/main/java/cn/zbx1425/worldcomment/render/ControlTipRenderer.java b/common/src/main/java/cn/zbx1425/worldcomment/render/ControlTipRenderer.java index 7b4f600..41b1dd9 100644 --- a/common/src/main/java/cn/zbx1425/worldcomment/render/ControlTipRenderer.java +++ b/common/src/main/java/cn/zbx1425/worldcomment/render/ControlTipRenderer.java @@ -3,6 +3,7 @@ import cn.zbx1425.worldcomment.Main; import cn.zbx1425.worldcomment.data.client.ClientRayPicking; import cn.zbx1425.worldcomment.gui.IGuiCommon; +import cn.zbx1425.worldcomment.item.CommentToolItem; import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; @@ -10,6 +11,7 @@ import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; import java.util.List; @@ -55,8 +57,9 @@ public static void update() { if (minecraft.player == null) { return; } - if (minecraft.player.getMainHandItem().is(Main.ITEM_COMMENT_TOOL.get())) { - if (minecraft.player.getMainHandItem().getOrCreateTag().contains("uploadJobId", Tag.TAG_LONG)) { + ItemStack item = CommentToolItem.Client.getHoldingCommentTool(); + if (item != null) { + if (item.getOrCreateTag().contains("uploadJobId", Tag.TAG_LONG)) { TIP_PLACE_COMMENT.visible = true; return; // De-clutter } else {