优化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.sounds.SoundSource;
import net.minecraft.util.Mth;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
@ -290,9 +291,18 @@ public class ClickHandler {
isEditing = !isEditing;
}
if (stack.getItem() instanceof ItemScreenProvider provider) {
var screen = provider.getItemScreen(stack, player);
var screen = provider.getItemScreen(stack, player, InteractionHand.MAIN_HAND);
if (screen != null) {
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 {
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.util.Mth;
import net.minecraft.util.StringUtil;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.item.ItemStack;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.api.distmarker.OnlyIn;
@ -38,6 +39,7 @@ public class DogTagEditorScreen extends Screen {
private short[][] icon = new short[16][16];
public ItemStack stack;
private InteractionHand hand;
private boolean init = false;
@ -47,9 +49,10 @@ public class DogTagEditorScreen extends Screen {
@Nullable
private String itemName;
public DogTagEditorScreen(ItemStack stack) {
public DogTagEditorScreen(ItemStack stack, InteractionHand hand) {
super(GameNarrator.NO_TITLE);
this.stack = stack;
this.hand = hand;
imageWidth = 207;
imageHeight = 185;
}
@ -256,7 +259,6 @@ public class DogTagEditorScreen extends Screen {
if (DogTagEditorScreen.this.minecraft != null) {
DogTagEditorScreen.this.minecraft.setScreen(null);
}
var colors = new ArrayList<Short>(DogTagEditorScreen.this.icon.length * DogTagEditorScreen.this.icon[0].length);
for (var row : DogTagEditorScreen.this.icon) {
@ -266,7 +268,8 @@ public class DogTagEditorScreen extends Screen {
}
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

View file

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

View file

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

View file

@ -1,6 +1,7 @@
package com.atsuishio.superbwarfare.item;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.neoforged.api.distmarker.Dist;
@ -10,5 +11,5 @@ import org.jetbrains.annotations.Nullable;
public interface ItemScreenProvider {
@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;
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 StreamCodec<ByteBuf, DogTagFinishEditMessage> STREAM_CODEC = StreamCodec.composite(
ByteBufCodecs.SHORT.apply(ByteBufCodecs.list()), DogTagFinishEditMessage::colors,
ByteBufCodecs.STRING_UTF8, DogTagFinishEditMessage::name,
ByteBufCodecs.BOOL, DogTagFinishEditMessage::mainHand,
DogTagFinishEditMessage::new
);
@ -29,7 +31,7 @@ public record DogTagFinishEditMessage(List<Short> colors, String name) implement
public static void handler(DogTagFinishEditMessage message, final IPayloadContext context) {
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;
stack.set(ModDataComponents.DOG_TAG_IMAGE, message.colors);

View file

@ -252,7 +252,7 @@
"item.superbwarfare.medium_armament_module": "Medium Armament Module",
"item.superbwarfare.heavy_armament_module": "Heavy Armament Module",
"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",

View file

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