优化screen provider逻辑

This commit is contained in:
17146 2025-07-10 22:18:21 +08:00 committed by Light_Quanta
parent f6f2de4f22
commit 9de5cb6676
No known key found for this signature in database
GPG key ID: 11A39A1B8C890959
8 changed files with 29 additions and 13 deletions

View file

@ -30,6 +30,7 @@ import net.minecraft.core.component.DataComponents;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.sounds.SoundSource; import net.minecraft.sounds.SoundSource;
import net.minecraft.util.Mth; import net.minecraft.util.Mth;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
@ -290,9 +291,18 @@ public class ClickHandler {
isEditing = !isEditing; isEditing = !isEditing;
} }
if (stack.getItem() instanceof ItemScreenProvider provider) { if (stack.getItem() instanceof ItemScreenProvider provider) {
var screen = provider.getItemScreen(stack, player); var screen = provider.getItemScreen(stack, player, InteractionHand.MAIN_HAND);
if (screen != null) { if (screen != null) {
Minecraft.getInstance().setScreen(screen); Minecraft.getInstance().setScreen(screen);
return;
}
}
ItemStack offHand = player.getOffhandItem();
if (offHand.getItem() instanceof ItemScreenProvider provider) {
var screen = provider.getItemScreen(offHand, player, InteractionHand.OFF_HAND);
if (screen != null) {
Minecraft.getInstance().setScreen(screen);
return;
} }
} }
} }
@ -358,7 +368,6 @@ public class ClickHandler {
} }
} }
} }
} else { } else {
if (player.hasEffect(ModMobEffects.SHOCK)) return; if (player.hasEffect(ModMobEffects.SHOCK)) return;

View file

@ -17,6 +17,7 @@ import net.minecraft.network.protocol.game.ServerboundRenameItemPacket;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.Mth; import net.minecraft.util.Mth;
import net.minecraft.util.StringUtil; import net.minecraft.util.StringUtil;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.Dist;
import net.neoforged.api.distmarker.OnlyIn; import net.neoforged.api.distmarker.OnlyIn;
@ -38,6 +39,7 @@ public class DogTagEditorScreen extends Screen {
private short[][] icon = new short[16][16]; private short[][] icon = new short[16][16];
public ItemStack stack; public ItemStack stack;
private InteractionHand hand;
private boolean init = false; private boolean init = false;
@ -47,9 +49,10 @@ public class DogTagEditorScreen extends Screen {
@Nullable @Nullable
private String itemName; private String itemName;
public DogTagEditorScreen(ItemStack stack) { public DogTagEditorScreen(ItemStack stack, InteractionHand hand) {
super(GameNarrator.NO_TITLE); super(GameNarrator.NO_TITLE);
this.stack = stack; this.stack = stack;
this.hand = hand;
imageWidth = 207; imageWidth = 207;
imageHeight = 185; imageHeight = 185;
} }
@ -256,7 +259,6 @@ public class DogTagEditorScreen extends Screen {
if (DogTagEditorScreen.this.minecraft != null) { if (DogTagEditorScreen.this.minecraft != null) {
DogTagEditorScreen.this.minecraft.setScreen(null); DogTagEditorScreen.this.minecraft.setScreen(null);
} }
var colors = new ArrayList<Short>(DogTagEditorScreen.this.icon.length * DogTagEditorScreen.this.icon[0].length); var colors = new ArrayList<Short>(DogTagEditorScreen.this.icon.length * DogTagEditorScreen.this.icon[0].length);
for (var row : DogTagEditorScreen.this.icon) { for (var row : DogTagEditorScreen.this.icon) {
@ -266,7 +268,8 @@ public class DogTagEditorScreen extends Screen {
} }
this.updateLocal(colors, DogTagEditorScreen.this.name.getValue()); this.updateLocal(colors, DogTagEditorScreen.this.name.getValue());
PacketDistributor.sendToServer(new DogTagFinishEditMessage(colors, DogTagEditorScreen.this.name.getValue())); PacketDistributor.sendToServer(new DogTagFinishEditMessage(colors, DogTagEditorScreen.this.name.getValue(),
DogTagEditorScreen.this.hand == InteractionHand.MAIN_HAND));
} }
@Override @Override

View file

@ -6,6 +6,7 @@ import com.atsuishio.superbwarfare.client.tooltip.component.DogTagImageComponent
import com.atsuishio.superbwarfare.component.ModDataComponents; import com.atsuishio.superbwarfare.component.ModDataComponents;
import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.Screen;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.inventory.tooltip.TooltipComponent; import net.minecraft.world.inventory.tooltip.TooltipComponent;
@ -74,7 +75,7 @@ public class DogTag extends Item implements ICurioItem, ItemScreenProvider {
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
@Override @Override
public @Nullable Screen getItemScreen(ItemStack stack, Player player) { public @Nullable Screen getItemScreen(ItemStack stack, Player player, InteractionHand hand) {
return new DogTagEditorScreen(stack); return new DogTagEditorScreen(stack, hand);
} }
} }

View file

@ -92,7 +92,7 @@ public class FiringParameters extends Item implements ItemScreenProvider {
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
@Override @Override
public @Nullable Screen getItemScreen(ItemStack stack, Player player) { public @Nullable Screen getItemScreen(ItemStack stack, Player player, InteractionHand hand) {
return new FiringParametersScreen(stack); return new FiringParametersScreen(stack);
} }
} }

View file

@ -1,6 +1,7 @@
package com.atsuishio.superbwarfare.item; package com.atsuishio.superbwarfare.item;
import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.Screen;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.Dist;
@ -10,5 +11,5 @@ import org.jetbrains.annotations.Nullable;
public interface ItemScreenProvider { public interface ItemScreenProvider {
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
@Nullable Screen getItemScreen(ItemStack stack, Player player); @Nullable Screen getItemScreen(ItemStack stack, Player player, InteractionHand hand);
} }

View file

@ -16,12 +16,14 @@ import org.jetbrains.annotations.NotNull;
import java.util.List; import java.util.List;
public record DogTagFinishEditMessage(List<Short> colors, String name) implements CustomPacketPayload { public record DogTagFinishEditMessage(List<Short> colors, String name,
boolean mainHand) implements CustomPacketPayload {
public static final Type<DogTagFinishEditMessage> TYPE = new Type<>(Mod.loc("dog_tag_finish_edit")); public static final Type<DogTagFinishEditMessage> TYPE = new Type<>(Mod.loc("dog_tag_finish_edit"));
public static final StreamCodec<ByteBuf, DogTagFinishEditMessage> STREAM_CODEC = StreamCodec.composite( public static final StreamCodec<ByteBuf, DogTagFinishEditMessage> STREAM_CODEC = StreamCodec.composite(
ByteBufCodecs.SHORT.apply(ByteBufCodecs.list()), DogTagFinishEditMessage::colors, ByteBufCodecs.SHORT.apply(ByteBufCodecs.list()), DogTagFinishEditMessage::colors,
ByteBufCodecs.STRING_UTF8, DogTagFinishEditMessage::name, ByteBufCodecs.STRING_UTF8, DogTagFinishEditMessage::name,
ByteBufCodecs.BOOL, DogTagFinishEditMessage::mainHand,
DogTagFinishEditMessage::new DogTagFinishEditMessage::new
); );
@ -29,7 +31,7 @@ public record DogTagFinishEditMessage(List<Short> colors, String name) implement
public static void handler(DogTagFinishEditMessage message, final IPayloadContext context) { public static void handler(DogTagFinishEditMessage message, final IPayloadContext context) {
ServerPlayer serverPlayer = (ServerPlayer) context.player(); ServerPlayer serverPlayer = (ServerPlayer) context.player();
ItemStack stack = serverPlayer.getMainHandItem(); ItemStack stack = message.mainHand ? serverPlayer.getMainHandItem() : serverPlayer.getOffhandItem();
if (!stack.is(ModItems.DOG_TAG.get())) return; if (!stack.is(ModItems.DOG_TAG.get())) return;
stack.set(ModDataComponents.DOG_TAG_IMAGE, message.colors); stack.set(ModDataComponents.DOG_TAG_IMAGE, message.colors);

View file

@ -252,7 +252,7 @@
"item.superbwarfare.medium_armament_module": "Medium Armament Module", "item.superbwarfare.medium_armament_module": "Medium Armament Module",
"item.superbwarfare.heavy_armament_module": "Heavy Armament Module", "item.superbwarfare.heavy_armament_module": "Heavy Armament Module",
"item.superbwarfare.artillery_indicator": "Artillery Indicator", "item.superbwarfare.artillery_indicator": "Artillery Indicator",
"des.superbwarfare.item_screen_provider": "Press %1$s key to open GUI when holding with main hand", "des.superbwarfare.item_screen_provider": "Press %1$s key to open GUI",
"attribute.superbwarfare.bullet_resistance": "Bullet Resistance", "attribute.superbwarfare.bullet_resistance": "Bullet Resistance",

View file

@ -252,7 +252,7 @@
"item.superbwarfare.medium_armament_module": "中型武装模块", "item.superbwarfare.medium_armament_module": "中型武装模块",
"item.superbwarfare.heavy_armament_module": "重型武装模块", "item.superbwarfare.heavy_armament_module": "重型武装模块",
"item.superbwarfare.artillery_indicator": "火炮指示器", "item.superbwarfare.artillery_indicator": "火炮指示器",
"des.superbwarfare.item_screen_provider": "在主手时按下 %1$s 以打开GUI", "des.superbwarfare.item_screen_provider": "按下 %1$s 以打开GUI",
"attribute.superbwarfare.bullet_resistance": "子弹防护", "attribute.superbwarfare.bullet_resistance": "子弹防护",