From 6f28568a17157366e09366d35f8013ec73a83d1a Mon Sep 17 00:00:00 2001 From: ScarletRedMan Date: Mon, 23 Dec 2024 00:22:29 +0700 Subject: [PATCH] feat: implemented clear inventory inside dialog --- .../api/talk/dialogue/DialogueRenderer.java | 61 ++++++++++++++++++- 1 file changed, 58 insertions(+), 3 deletions(-) diff --git a/api/src/main/java/ru/dragonestia/msb3/api/talk/dialogue/DialogueRenderer.java b/api/src/main/java/ru/dragonestia/msb3/api/talk/dialogue/DialogueRenderer.java index 5bfca5b..b186cbd 100644 --- a/api/src/main/java/ru/dragonestia/msb3/api/talk/dialogue/DialogueRenderer.java +++ b/api/src/main/java/ru/dragonestia/msb3/api/talk/dialogue/DialogueRenderer.java @@ -2,14 +2,18 @@ package ru.dragonestia.msb3.api.talk.dialogue; import lombok.Getter; import lombok.Setter; +import lombok.extern.log4j.Log4j2; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.format.Style; import net.kyori.adventure.text.format.TextColor; import net.kyori.adventure.text.minimessage.MiniMessage; import net.minestom.server.entity.Player; +import net.minestom.server.event.EventListener; +import net.minestom.server.event.inventory.InventoryCloseEvent; import net.minestom.server.inventory.Inventory; import net.minestom.server.inventory.InventoryType; +import net.minestom.server.item.ItemStack; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import ru.dragonestia.msb3.api.ServerBootstrap; @@ -19,11 +23,13 @@ import ru.dragonestia.msb3.api.glyph.glyph.image.TextureProperties; import ru.dragonestia.msb3.api.glyph.pack.GlyphResourcePack; import ru.dragonestia.msb3.api.resource.dialog.ButtonNumber; import ru.dragonestia.msb3.api.util.StringUtil; +import ru.dragonestia.msb3.api.util.UncheckedRunnable; import java.util.ArrayList; import java.util.EnumMap; import java.util.List; +@Log4j2 public class DialogueRenderer extends Inventory { public static final int CHEST_GUI_WIDTH = 176; @@ -36,6 +42,10 @@ public class DialogueRenderer extends Inventory { private int maxLines = 0; private final EnumMap buttonsText = new EnumMap<>(ButtonNumber.class); + private ItemStack[] itemBackup; + private EventListener onCloseListener; + @Getter @Setter private UncheckedRunnable onClose; + public DialogueRenderer(Player player, DialogueTheme theme) { super(InventoryType.CHEST_6_ROW, Component.empty()); this.player = player; @@ -69,12 +79,57 @@ public class DialogueRenderer extends Inventory { } public void show() { - rerender(); - player.openInventory(this); + try { + onOpen(); + + player.openInventory(this); + } catch (Exception e) { + onClose(); + + log.error(e.getMessage(), e); + } } public void close() { - player.closeInventory(); + onClose(); + } + + private void onOpen() { + synchronized (this) { + itemBackup = player.getInventory().getItemStacks(); + player.getInventory().clear(); + + rerender(); + + onCloseListener = EventListener.of(InventoryCloseEvent.class, event -> { + if (event.getInventory() instanceof DialogueRenderer renderer) { + renderer.close(); + } + }); + player.eventNode().addListener(onCloseListener); + } + } + + private void onClose() { + synchronized (this) { + if (itemBackup != null) { + var inv = player.getInventory(); + for (int i = 0; i < itemBackup.length; i++) { + inv.setItemStack(i, itemBackup[i]); + } + + itemBackup = null; + } + + player.closeInventory(); + + if (onCloseListener != null) { + player.eventNode().removeListener(onCloseListener); + onCloseListener = null; + } + } + + if (onClose != null) onClose.run(); } private Component render() {