优化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.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;
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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",
|
||||||
|
|
||||||
|
|
|
@ -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": "子弹防护",
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue