feat: implemented clear inventory inside dialog

This commit is contained in:
Andrey Terentev 2024-12-23 00:22:29 +07:00
parent 4fc1618835
commit 6f28568a17

View File

@ -2,14 +2,18 @@ package ru.dragonestia.msb3.api.talk.dialogue;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import lombok.extern.log4j.Log4j2;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.format.Style; import net.kyori.adventure.text.format.Style;
import net.kyori.adventure.text.format.TextColor; import net.kyori.adventure.text.format.TextColor;
import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.MiniMessage;
import net.minestom.server.entity.Player; 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.Inventory;
import net.minestom.server.inventory.InventoryType; import net.minestom.server.inventory.InventoryType;
import net.minestom.server.item.ItemStack;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import ru.dragonestia.msb3.api.ServerBootstrap; 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.glyph.pack.GlyphResourcePack;
import ru.dragonestia.msb3.api.resource.dialog.ButtonNumber; import ru.dragonestia.msb3.api.resource.dialog.ButtonNumber;
import ru.dragonestia.msb3.api.util.StringUtil; import ru.dragonestia.msb3.api.util.StringUtil;
import ru.dragonestia.msb3.api.util.UncheckedRunnable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.EnumMap; import java.util.EnumMap;
import java.util.List; import java.util.List;
@Log4j2
public class DialogueRenderer extends Inventory { public class DialogueRenderer extends Inventory {
public static final int CHEST_GUI_WIDTH = 176; public static final int CHEST_GUI_WIDTH = 176;
@ -36,6 +42,10 @@ public class DialogueRenderer extends Inventory {
private int maxLines = 0; private int maxLines = 0;
private final EnumMap<ButtonNumber, String> buttonsText = new EnumMap<>(ButtonNumber.class); private final EnumMap<ButtonNumber, String> buttonsText = new EnumMap<>(ButtonNumber.class);
private ItemStack[] itemBackup;
private EventListener<InventoryCloseEvent> onCloseListener;
@Getter @Setter private UncheckedRunnable onClose;
public DialogueRenderer(Player player, DialogueTheme theme) { public DialogueRenderer(Player player, DialogueTheme theme) {
super(InventoryType.CHEST_6_ROW, Component.empty()); super(InventoryType.CHEST_6_ROW, Component.empty());
this.player = player; this.player = player;
@ -69,12 +79,57 @@ public class DialogueRenderer extends Inventory {
} }
public void show() { public void show() {
rerender(); try {
onOpen();
player.openInventory(this); player.openInventory(this);
} catch (Exception e) {
onClose();
log.error(e.getMessage(), e);
}
} }
public void close() { public void close() {
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(); player.closeInventory();
if (onCloseListener != null) {
player.eventNode().removeListener(onCloseListener);
onCloseListener = null;
}
}
if (onClose != null) onClose.run();
} }
private Component render() { private Component render() {