feat: implemented clear inventory inside dialog
This commit is contained in:
parent
4fc1618835
commit
6f28568a17
@ -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() {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user