diff --git a/src/main/java/com/atsuishio/superbwarfare/client/screens/DogTagEditorScreen.java b/src/main/java/com/atsuishio/superbwarfare/client/screens/DogTagEditorScreen.java index bbacf7d52..00775049e 100644 --- a/src/main/java/com/atsuishio/superbwarfare/client/screens/DogTagEditorScreen.java +++ b/src/main/java/com/atsuishio/superbwarfare/client/screens/DogTagEditorScreen.java @@ -2,55 +2,61 @@ package com.atsuishio.superbwarfare.client.screens; import com.atsuishio.superbwarfare.Mod; import com.atsuishio.superbwarfare.item.DogTag; -import com.atsuishio.superbwarfare.menu.DogTagEditorMenu; import com.atsuishio.superbwarfare.network.message.send.DogTagFinishEditMessage; import net.minecraft.ChatFormatting; +import net.minecraft.client.GameNarrator; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.AbstractButton; import net.minecraft.client.gui.components.EditBox; import net.minecraft.client.gui.narration.NarrationElementOutput; import net.minecraft.client.gui.screens.Screen; -import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import net.minecraft.core.component.DataComponents; import net.minecraft.network.chat.Component; import net.minecraft.network.protocol.game.ServerboundRenameItemPacket; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; -import net.minecraft.world.entity.player.Inventory; +import net.minecraft.util.StringUtil; import net.minecraft.world.item.ItemStack; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; import net.neoforged.neoforge.network.PacketDistributor; import org.jetbrains.annotations.NotNull; +import javax.annotation.Nullable; import java.util.ArrayList; import java.util.Arrays; @OnlyIn(Dist.CLIENT) -public class DogTagEditorScreen extends AbstractContainerScreen { +public class DogTagEditorScreen extends Screen { private static final ResourceLocation TEXTURE = Mod.loc("textures/gui/dog_tag_editor.png"); public EditBox name; private short currentColor = 0; private short[][] icon = new short[16][16]; + public ItemStack stack; + private boolean init = false; - public DogTagEditorScreen(DogTagEditorMenu pMenu, Inventory pPlayerInventory, Component pTitle) { - super(pMenu, pPlayerInventory, pTitle); - this.stack = pMenu.stack; + protected int imageWidth; + protected int imageHeight; + + @Nullable + private String itemName; + + public DogTagEditorScreen(ItemStack stack) { + super(GameNarrator.NO_TITLE); + this.stack = stack; imageWidth = 207; imageHeight = 185; } - @Override protected void renderBg(GuiGraphics pGuiGraphics, float pPartialTick, int pMouseX, int pMouseY) { int i = (this.width - this.imageWidth) / 2; int j = (this.height - this.imageHeight) / 2; pGuiGraphics.blit(TEXTURE, i, j, 0, 0, this.imageWidth, this.imageHeight, 256, 256); - ItemStack stack = DogTagEditorScreen.this.menu.stack; pGuiGraphics.renderItem(stack, i + 18, j + 36); var pose = pGuiGraphics.pose(); @@ -76,7 +82,7 @@ public class DogTagEditorScreen extends AbstractContainerScreen(DogTagEditorScreen.this.icon.length * DogTagEditorScreen.this.icon[0].length); for (var row : DogTagEditorScreen.this.icon) { diff --git a/src/main/java/com/atsuishio/superbwarfare/init/ModMenuTypes.java b/src/main/java/com/atsuishio/superbwarfare/init/ModMenuTypes.java index d1558caf4..e40b30635 100644 --- a/src/main/java/com/atsuishio/superbwarfare/init/ModMenuTypes.java +++ b/src/main/java/com/atsuishio/superbwarfare/init/ModMenuTypes.java @@ -28,8 +28,4 @@ public class ModMenuTypes { public static final Supplier> FUMO_25_MENU = REGISTRY.register("fumo_25_menu", () -> IMenuTypeExtension.create((windowId, inv, data) -> new FuMO25Menu(windowId, inv))); - - public static final Supplier> DOG_TAG_EDITOR_MENU = - REGISTRY.register("dog_tag_editor_menu", - () -> IMenuTypeExtension.create((windowId, inv, data) -> new DogTagEditorMenu(windowId))); } diff --git a/src/main/java/com/atsuishio/superbwarfare/init/ModScreens.java b/src/main/java/com/atsuishio/superbwarfare/init/ModScreens.java index 2c4326b7d..c136e251a 100644 --- a/src/main/java/com/atsuishio/superbwarfare/init/ModScreens.java +++ b/src/main/java/com/atsuishio/superbwarfare/init/ModScreens.java @@ -17,6 +17,5 @@ public class ModScreens { event.register(ModMenuTypes.VEHICLE_MENU.get(), VehicleScreen::new); event.register(ModMenuTypes.SUPERB_ITEM_INTERFACE_MENU.get(), SuperbItemInterfaceScreen::new); event.register(ModMenuTypes.FUMO_25_MENU.get(), FuMO25Screen::new); - event.register(ModMenuTypes.DOG_TAG_EDITOR_MENU.get(), DogTagEditorScreen::new); } } diff --git a/src/main/java/com/atsuishio/superbwarfare/item/DogTag.java b/src/main/java/com/atsuishio/superbwarfare/item/DogTag.java index 690d2a5b6..3931bb3de 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/DogTag.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/DogTag.java @@ -1,20 +1,16 @@ package com.atsuishio.superbwarfare.item; +import com.atsuishio.superbwarfare.client.screens.DogTagEditorScreen; import com.atsuishio.superbwarfare.client.tooltip.component.DogTagImageComponent; import com.atsuishio.superbwarfare.component.ModDataComponents; -import com.atsuishio.superbwarfare.menu.DogTagEditorMenu; -import net.minecraft.network.chat.Component; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResultHolder; -import net.minecraft.world.SimpleMenuProvider; +import net.minecraft.client.gui.screens.Screen; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.inventory.ContainerLevelAccess; import net.minecraft.world.inventory.tooltip.TooltipComponent; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import top.theillusivec4.curios.api.CuriosApi; import top.theillusivec4.curios.api.SlotContext; import top.theillusivec4.curios.api.type.capability.ICurioItem; @@ -23,7 +19,7 @@ import java.util.Arrays; import java.util.Optional; import java.util.concurrent.atomic.AtomicBoolean; -public class DogTag extends Item implements ICurioItem { +public class DogTag extends Item implements ICurioItem, ItemScreenProvider { public DogTag() { super(new Properties().stacksTo(1)); @@ -38,17 +34,18 @@ public class DogTag extends Item implements ICurioItem { return flag.get(); } - @Override - public @NotNull InteractionResultHolder use(Level level, Player player, @NotNull InteractionHand usedHand) { - ItemStack stack = player.getItemInHand(usedHand); - if (level.isClientSide) { - return InteractionResultHolder.success(stack); - } else { - player.openMenu(new SimpleMenuProvider((i, inventory, p) -> - new DogTagEditorMenu(i, ContainerLevelAccess.create(level, p.getOnPos()), stack), Component.empty())); - return InteractionResultHolder.consume(stack); - } - } +// @Override +// @ParametersAreNonnullByDefault +// public @NotNull InteractionResultHolder use(Level pLevel, Player pPlayer, InteractionHand pUsedHand) { +// ItemStack stack = pPlayer.getItemInHand(pUsedHand); +// if (pLevel.isClientSide) { +// return InteractionResultHolder.success(stack); +// } else { +// pPlayer.openMenu(new SimpleMenuProvider((i, inventory, player) -> +// new DogTagEditorMenu(i, ContainerLevelAccess.create(pLevel, pPlayer.getOnPos()), stack), Component.empty())); +// return InteractionResultHolder.consume(stack); +// } +// } @Override public @NotNull Optional getTooltipImage(@NotNull ItemStack pStack) { @@ -74,4 +71,9 @@ public class DogTag extends Item implements ICurioItem { return colors; } + + @Override + public @Nullable Screen getItemScreen(ItemStack stack, Player player) { + return new DogTagEditorScreen(stack); + } } diff --git a/src/main/java/com/atsuishio/superbwarfare/menu/DogTagEditorMenu.java b/src/main/java/com/atsuishio/superbwarfare/menu/DogTagEditorMenu.java deleted file mode 100644 index d929bfac4..000000000 --- a/src/main/java/com/atsuishio/superbwarfare/menu/DogTagEditorMenu.java +++ /dev/null @@ -1,106 +0,0 @@ -package com.atsuishio.superbwarfare.menu; - -import com.atsuishio.superbwarfare.component.ModDataComponents; -import com.atsuishio.superbwarfare.init.ModItems; -import com.atsuishio.superbwarfare.init.ModMenuTypes; -import com.atsuishio.superbwarfare.network.message.receive.DogTagEditorMessage; -import net.minecraft.core.component.DataComponents; -import net.minecraft.network.chat.Component; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.util.StringUtil; -import net.minecraft.world.Container; -import net.minecraft.world.SimpleContainer; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.inventory.ContainerLevelAccess; -import net.minecraft.world.item.ItemStack; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.neoforge.event.entity.player.PlayerContainerEvent; -import net.neoforged.neoforge.network.PacketDistributor; -import org.jetbrains.annotations.NotNull; - -import javax.annotation.Nullable; -import java.util.List; - -@EventBusSubscriber(bus = EventBusSubscriber.Bus.GAME) -public class DogTagEditorMenu extends AbstractContainerMenu { - - protected final Container container; - protected final ContainerLevelAccess access; - @Nullable - private String itemName; - - public ItemStack stack; - - public DogTagEditorMenu(int pContainerId) { - this(pContainerId, new SimpleContainer(0), ContainerLevelAccess.NULL, ItemStack.EMPTY); - } - - public DogTagEditorMenu(int pContainerId, ContainerLevelAccess access, ItemStack stack) { - this(pContainerId, new SimpleContainer(0), access, stack); - } - - public DogTagEditorMenu(int pContainerId, Container container, ContainerLevelAccess pContainerLevelAccess, ItemStack stack) { - super(ModMenuTypes.DOG_TAG_EDITOR_MENU.get(), pContainerId); - - checkContainerSize(container, 0); - - this.container = container; - this.access = pContainerLevelAccess; - this.stack = stack; - } - - @Override - public @NotNull ItemStack quickMoveStack(@NotNull Player player, int index) { - return ItemStack.EMPTY; - } - - @Override - public boolean stillValid(Player pPlayer) { - return pPlayer.isAlive(); - } - - public boolean setItemName(String name) { - String s = validateName(name); - if (s != null && !s.equals(this.itemName)) { - this.itemName = s; - if (!this.stack.isEmpty()) { - if (StringUtil.isBlank(s)) { - this.stack.remove(DataComponents.CUSTOM_NAME); - } else { - this.stack.set(DataComponents.CUSTOM_NAME, Component.literal(s)); - } - } - return true; - } else { - return false; - } - } - - @Nullable - private static String validateName(String pItemName) { - String s = StringUtil.filterText(pItemName); - return s.length() <= 30 ? s : null; - } - - @SubscribeEvent - public static void onContainerOpened(PlayerContainerEvent.Open event) { - if (event.getContainer() instanceof DogTagEditorMenu menu && event.getEntity() instanceof ServerPlayer serverPlayer) { - var stack = serverPlayer.getItemInHand(serverPlayer.getUsedItemHand()); - if (stack.is(ModItems.DOG_TAG.get())) { - PacketDistributor.sendToPlayer(serverPlayer, new DogTagEditorMessage(menu.containerId, stack)); - } - } - } - - public void finishEdit(List colors, String name) { - if (this.stack.isEmpty()) return; - - stack.set(ModDataComponents.DOG_TAG_IMAGE, colors); - - if (!name.isEmpty()) { - this.stack.set(DataComponents.CUSTOM_NAME, Component.literal(name)); - } - } -} diff --git a/src/main/java/com/atsuishio/superbwarfare/network/ClientPacketHandler.java b/src/main/java/com/atsuishio/superbwarfare/network/ClientPacketHandler.java index 7efa6f4de..de04bcf4d 100644 --- a/src/main/java/com/atsuishio/superbwarfare/network/ClientPacketHandler.java +++ b/src/main/java/com/atsuishio/superbwarfare/network/ClientPacketHandler.java @@ -1,12 +1,9 @@ package com.atsuishio.superbwarfare.network; -import com.atsuishio.superbwarfare.client.screens.DogTagEditorScreen; import com.atsuishio.superbwarfare.event.ClientEventHandler; -import com.atsuishio.superbwarfare.menu.DogTagEditorMenu; import net.minecraft.client.CameraType; import net.minecraft.client.Minecraft; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; import java.util.Objects; @@ -19,14 +16,4 @@ public class ClientPacketHandler { Minecraft.getInstance().options.setCameraType(Objects.requireNonNullElse(ClientEventHandler.lastCameraType, CameraType.FIRST_PERSON)); } - - public static void handleDogTagEditorMessage(int containerId, ItemStack stack) { - Minecraft mc = Minecraft.getInstance(); - if (mc.player != null && mc.player.containerMenu.containerId == containerId) { - ((DogTagEditorMenu) mc.player.containerMenu).stack = stack; - if (mc.screen instanceof DogTagEditorScreen dogTagEditorScreen) { - dogTagEditorScreen.stack = stack; - } - } - } } diff --git a/src/main/java/com/atsuishio/superbwarfare/network/NetworkRegistry.java b/src/main/java/com/atsuishio/superbwarfare/network/NetworkRegistry.java index 4cdde0d64..f1dbb8780 100644 --- a/src/main/java/com/atsuishio/superbwarfare/network/NetworkRegistry.java +++ b/src/main/java/com/atsuishio/superbwarfare/network/NetworkRegistry.java @@ -10,11 +10,8 @@ import net.neoforged.neoforge.network.handling.IPayloadHandler; import net.neoforged.neoforge.network.registration.PayloadRegistrar; public class NetworkRegistry { - private static PayloadRegistrar registrar; - - public static void register(final RegisterPayloadHandlersEvent event) { - registrar = event.registrar("1"); + private static void register() { playToClient(PlayerVariablesSyncMessage.TYPE, PlayerVariablesSyncMessage.STREAM_CODEC, (msg, ctx) -> PlayerVariablesSyncMessage.handler(msg)); playToClient(ShakeClientMessage.TYPE, ShakeClientMessage.STREAM_CODEC, ShakeClientMessage::handler); playToClient(ClientMotionSyncMessage.TYPE, ClientMotionSyncMessage.STREAM_CODEC, ClientMotionSyncMessage::handler); @@ -28,7 +25,6 @@ public class NetworkRegistry { playToClient(RadarMenuOpenMessage.TYPE, RadarMenuOpenMessage.STREAM_CODEC, RadarMenuOpenMessage::handler); playToClient(RadarMenuCloseMessage.TYPE, RadarMenuCloseMessage.STREAM_CODEC, (message1, context1) -> RadarMenuCloseMessage.handler()); playToClient(ClientTacticalSprintSyncMessage.TYPE, ClientTacticalSprintSyncMessage.STREAM_CODEC, (msg, ctx) -> ClientTacticalSprintSyncMessage.handler(msg)); - playToClient(DogTagEditorMessage.TYPE, DogTagEditorMessage.STREAM_CODEC, (msg, ctx) -> DogTagEditorMessage.handler(msg)); playToClient(VehiclesDataMessage.TYPE, VehiclesDataMessage.STREAM_CODEC, (msg, ctx) -> VehiclesDataMessage.handler(msg)); playToServer(LaserShootMessage.TYPE, LaserShootMessage.STREAM_CODEC, LaserShootMessage::handler); @@ -67,6 +63,13 @@ public class NetworkRegistry { playToServer(MouseMoveMessage.TYPE, MouseMoveMessage.STREAM_CODEC, MouseMoveMessage::handler); } + private static PayloadRegistrar registrar; + + public static void register(final RegisterPayloadHandlersEvent event) { + registrar = event.registrar("1"); + register(); + } + public static void playToClient(CustomPacketPayload.Type type, StreamCodec reader, IPayloadHandler handler) { registrar.playToClient(type, reader, handler); } diff --git a/src/main/java/com/atsuishio/superbwarfare/network/message/receive/DogTagEditorMessage.java b/src/main/java/com/atsuishio/superbwarfare/network/message/receive/DogTagEditorMessage.java deleted file mode 100644 index 5c85ee9d3..000000000 --- a/src/main/java/com/atsuishio/superbwarfare/network/message/receive/DogTagEditorMessage.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.atsuishio.superbwarfare.network.message.receive; - -import com.atsuishio.superbwarfare.Mod; -import com.atsuishio.superbwarfare.network.ClientPacketHandler; -import net.minecraft.network.RegistryFriendlyByteBuf; -import net.minecraft.network.codec.ByteBufCodecs; -import net.minecraft.network.codec.StreamCodec; -import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -import net.minecraft.world.item.ItemStack; -import org.jetbrains.annotations.NotNull; - -public record DogTagEditorMessage(int containerId, ItemStack stack) implements CustomPacketPayload { - - public static final Type TYPE = new Type<>(Mod.loc("dog_tag_editor")); - - public static final StreamCodec STREAM_CODEC = StreamCodec.composite( - ByteBufCodecs.INT, DogTagEditorMessage::containerId, - ItemStack.STREAM_CODEC, DogTagEditorMessage::stack, - DogTagEditorMessage::new - ); - - - public static void handler(DogTagEditorMessage message) { - ClientPacketHandler.handleDogTagEditorMessage(message.containerId, message.stack); - } - - @Override - public @NotNull Type type() { - return TYPE; - } -} diff --git a/src/main/java/com/atsuishio/superbwarfare/network/message/send/DogTagFinishEditMessage.java b/src/main/java/com/atsuishio/superbwarfare/network/message/send/DogTagFinishEditMessage.java index 4f85c35ab..3e68d2f96 100644 --- a/src/main/java/com/atsuishio/superbwarfare/network/message/send/DogTagFinishEditMessage.java +++ b/src/main/java/com/atsuishio/superbwarfare/network/message/send/DogTagFinishEditMessage.java @@ -1,12 +1,16 @@ package com.atsuishio.superbwarfare.network.message.send; import com.atsuishio.superbwarfare.Mod; -import com.atsuishio.superbwarfare.menu.DogTagEditorMenu; +import com.atsuishio.superbwarfare.component.ModDataComponents; +import com.atsuishio.superbwarfare.init.ModItems; import io.netty.buffer.ByteBuf; +import net.minecraft.core.component.DataComponents; +import net.minecraft.network.chat.Component; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.item.ItemStack; import net.neoforged.neoforge.network.handling.IPayloadContext; import org.jetbrains.annotations.NotNull; @@ -25,11 +29,14 @@ public record DogTagFinishEditMessage(List colors, String name) implement public static void handler(DogTagFinishEditMessage message, final IPayloadContext context) { ServerPlayer serverPlayer = (ServerPlayer) context.player(); - if (serverPlayer.containerMenu instanceof DogTagEditorMenu menu) { - menu.finishEdit(message.colors, message.name); - } + ItemStack stack = serverPlayer.getMainHandItem(); + if (!stack.is(ModItems.DOG_TAG.get())) return; - serverPlayer.closeContainer(); + stack.set(ModDataComponents.DOG_TAG_IMAGE, message.colors); + + if (!message.name.isEmpty()) { + stack.set(DataComponents.CUSTOM_NAME, Component.literal(message.name)); + } } @Override