优化screen provider逻辑
This commit is contained in:
parent
f6f2de4f22
commit
9de5cb6676
8 changed files with 29 additions and 13 deletions
|
@ -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;
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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",
|
||||
|
||||
|
|
|
@ -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": "子弹防护",
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue