9
0
mirror of https://github.com/Xiao-MoMi/Custom-Fishing.git synced 2025-12-26 02:19:21 +00:00

nbt editor

This commit is contained in:
XiaoMoMi
2023-10-10 22:27:25 +08:00
parent 14c589c348
commit 25340f59aa
15 changed files with 826 additions and 28 deletions

View File

@@ -28,7 +28,6 @@ import net.momirealms.customfishing.api.util.ReflectionUtils;
import net.momirealms.customfishing.command.CommandManagerImpl;
import net.momirealms.customfishing.compatibility.IntegrationManagerImpl;
import net.momirealms.customfishing.compatibility.papi.PlaceholderManagerImpl;
import net.momirealms.customfishing.gui.icon.property.item.PriceItem;
import net.momirealms.customfishing.libraries.libraryloader.LibraryLoader;
import net.momirealms.customfishing.mechanic.action.ActionManagerImpl;
import net.momirealms.customfishing.mechanic.bag.BagManagerImpl;

View File

@@ -19,7 +19,6 @@ public class ScrollUpItem extends ScrollItem implements Icon {
builder.setDisplayName("§7Scroll up");
if (!gui.canScroll(-1))
builder.addLoreLines("§cYou've reached the top");
return builder;
}
}

View File

@@ -5,7 +5,6 @@ import net.momirealms.customfishing.adventure.AdventureManagerImpl;
import net.momirealms.customfishing.adventure.component.ShadedAdventureComponentWrapper;
import net.momirealms.customfishing.api.CustomFishingPlugin;
import net.momirealms.customfishing.gui.ItemPage;
import net.momirealms.customfishing.gui.page.property.PriceEditor;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.ClickType;

View File

@@ -0,0 +1,66 @@
package net.momirealms.customfishing.gui.icon.property.item;
import net.momirealms.customfishing.adventure.AdventureManagerImpl;
import net.momirealms.customfishing.adventure.component.ShadedAdventureComponentWrapper;
import net.momirealms.customfishing.gui.ItemPage;
import net.momirealms.customfishing.gui.page.property.NBTEditor;
import net.momirealms.customfishing.util.ConfigUtils;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.ClickType;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.jetbrains.annotations.NotNull;
import xyz.xenondevs.invui.item.ItemProvider;
import xyz.xenondevs.invui.item.builder.ItemBuilder;
import xyz.xenondevs.invui.item.impl.AbstractItem;
public class NBTItem extends AbstractItem {
private final ItemPage itemPage;
public NBTItem(ItemPage itemPage) {
this.itemPage = itemPage;
}
@Override
public ItemProvider getItemProvider() {
ItemBuilder itemBuilder = new ItemBuilder(Material.COMMAND_BLOCK)
.setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<#FA8072>● NBT"
)));
var section = itemPage.getSection().getConfigurationSection("nbt");
if (section != null) {
itemBuilder.addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<gray>Current value: "
)));
for (String line : ConfigUtils.getReadableSection(section.getValues(false))) {
itemBuilder.addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
line
)));
}
itemBuilder.addLoreLines("").addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<#00FF7F> -> Left click to edit"
))).addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<#FF6347> -> Right click to reset"
)));
} else {
itemBuilder.addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<#00FF7F> -> Left click to set"
)));
}
return itemBuilder;
}
@Override
public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) {
if (clickType.isLeftClick()) {
new NBTEditor(player, itemPage, itemPage.getSection());
} else if (clickType.isRightClick()) {
itemPage.getSection().set("nbt", null);
itemPage.save();
itemPage.reOpen();
}
}
}

View File

@@ -9,7 +9,6 @@ import net.momirealms.customfishing.gui.icon.BackToPageItem;
import net.momirealms.customfishing.gui.icon.NextPageItem;
import net.momirealms.customfishing.gui.icon.PreviousPageItem;
import net.momirealms.customfishing.gui.icon.property.item.*;
import net.momirealms.customfishing.gui.icon.property.loot.*;
import org.bukkit.Material;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
@@ -73,7 +72,7 @@ public class BaitEditor implements ItemPage {
var window = AnvilWindow.split()
.setViewer(player)
.setTitle(new ShadedAdventureComponentWrapper(
AdventureManagerImpl.getInstance().getComponentFromMiniMessage("Editing " + key)
AdventureManagerImpl.getInstance().getComponentFromMiniMessage("Edit " + key)
))
.setUpperGui(upperGui)
.setLowerGui(gui)
@@ -113,6 +112,7 @@ public class BaitEditor implements ItemPage {
items.add(new StackableItem(this));
items.add(new ItemFlagItem(this));
items.add(new Head64Item(this));
items.add(new NBTItem(this));
return items;
}

View File

@@ -9,7 +9,6 @@ import net.momirealms.customfishing.gui.icon.BackToPageItem;
import net.momirealms.customfishing.gui.icon.NextPageItem;
import net.momirealms.customfishing.gui.icon.PreviousPageItem;
import net.momirealms.customfishing.gui.icon.property.item.*;
import net.momirealms.customfishing.gui.icon.property.loot.*;
import org.bukkit.Material;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
@@ -73,7 +72,7 @@ public class HookEditor implements ItemPage {
var window = AnvilWindow.split()
.setViewer(player)
.setTitle(new ShadedAdventureComponentWrapper(
AdventureManagerImpl.getInstance().getComponentFromMiniMessage("Editing " + key)
AdventureManagerImpl.getInstance().getComponentFromMiniMessage("Edit " + key)
))
.setUpperGui(upperGui)
.setLowerGui(gui)
@@ -113,6 +112,7 @@ public class HookEditor implements ItemPage {
items.add(new StackableItem(this));
items.add(new ItemFlagItem(this));
items.add(new Head64Item(this));
items.add(new NBTItem(this));
return items;
}

View File

@@ -73,7 +73,7 @@ public class ItemEditor implements ItemPage {
var window = AnvilWindow.split()
.setViewer(player)
.setTitle(new ShadedAdventureComponentWrapper(
AdventureManagerImpl.getInstance().getComponentFromMiniMessage("Editing " + key)
AdventureManagerImpl.getInstance().getComponentFromMiniMessage("Edit " + key)
))
.setUpperGui(upperGui)
.setLowerGui(gui)
@@ -123,6 +123,7 @@ public class ItemEditor implements ItemPage {
items.add(new SizeItem(this));
items.add(new ItemFlagItem(this));
items.add(new Head64Item(this));
items.add(new NBTItem(this));
return items;
}

View File

@@ -1,5 +1,6 @@
package net.momirealms.customfishing.gui.page.item;
import de.tr7zw.changeme.nbtapi.NBTItem;
import net.momirealms.customfishing.adventure.AdventureManagerImpl;
import net.momirealms.customfishing.adventure.component.ShadedAdventureComponentWrapper;
import net.momirealms.customfishing.api.CustomFishingPlugin;
@@ -110,13 +111,10 @@ public class ItemSelector implements YamlPage {
if (!prefix.equals(SEARCH) && !entry.getKey().startsWith(prefix)) continue;
String material = section.getString("material");
if (material != null) {
if (!material.contains(":")) {
material = "CustomFishing:" + type + ":" + key;
}
ItemStack appearance = CustomFishingPlugin.get().getItemManager().getItemStackAppearance(player, material);
ItemBuilder itemBuilder = new ItemBuilder(appearance);
if (section.contains("custom-model-data"))
itemBuilder.setCustomModelData(section.getInt("custom-model-data"));
ItemStack build = CustomFishingPlugin.get().getItemManager().getItemBuilder(section, type, key).build(player);
NBTItem nbtItem = new NBTItem(build);
nbtItem.removeKey("display");
ItemBuilder itemBuilder = new ItemBuilder(nbtItem.getItem());
itemList.add(new ItemInList(key, itemBuilder, this));
continue;
}

View File

@@ -9,7 +9,6 @@ import net.momirealms.customfishing.gui.icon.BackToPageItem;
import net.momirealms.customfishing.gui.icon.NextPageItem;
import net.momirealms.customfishing.gui.icon.PreviousPageItem;
import net.momirealms.customfishing.gui.icon.property.item.*;
import net.momirealms.customfishing.gui.icon.property.loot.*;
import org.bukkit.Material;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
@@ -73,7 +72,7 @@ public class RodEditor implements ItemPage {
var window = AnvilWindow.split()
.setViewer(player)
.setTitle(new ShadedAdventureComponentWrapper(
AdventureManagerImpl.getInstance().getComponentFromMiniMessage("Editing " + key)
AdventureManagerImpl.getInstance().getComponentFromMiniMessage("Edit " + key)
))
.setUpperGui(upperGui)
.setLowerGui(gui)
@@ -111,6 +110,7 @@ public class RodEditor implements ItemPage {
items.add(new DurabilityItem(this));
items.add(new RandomDurabilityItem(this));
items.add(new ItemFlagItem(this));
items.add(new NBTItem(this));
return items;
}

View File

@@ -89,10 +89,10 @@ public class MaterialEditor {
ArrayList<Item> items = new ArrayList<>();
for (String lib : ((ItemManagerImpl) CustomFishingPlugin.get().getItemManager()).getItemLibraries()) {
switch (lib) {
case "MMOItems", "CustomFishing" -> {
case "MMOItems" -> {
items.add(new SimpleItem(new ItemBuilder(Material.BELL).setDisplayName(lib + ":TYPE:ID")));
}
case "vanilla" -> {
case "vanilla", "CustomFishing" -> {
}
default -> {
items.add(new SimpleItem(new ItemBuilder(Material.BELL).setDisplayName(lib + ":ID")));

View File

@@ -0,0 +1,686 @@
package net.momirealms.customfishing.gui.page.property;
import net.momirealms.customfishing.adventure.AdventureManagerImpl;
import net.momirealms.customfishing.adventure.component.ShadedAdventureComponentWrapper;
import net.momirealms.customfishing.gui.YamlPage;
import net.momirealms.customfishing.gui.icon.BackGroundItem;
import net.momirealms.customfishing.util.ConfigUtils;
import net.momirealms.customfishing.util.NBTUtils;
import org.bukkit.Material;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.ClickType;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import xyz.xenondevs.invui.gui.Gui;
import xyz.xenondevs.invui.gui.PagedGui;
import xyz.xenondevs.invui.gui.structure.Markers;
import xyz.xenondevs.invui.item.Item;
import xyz.xenondevs.invui.item.ItemProvider;
import xyz.xenondevs.invui.item.builder.ItemBuilder;
import xyz.xenondevs.invui.item.impl.AbstractItem;
import xyz.xenondevs.invui.window.AnvilWindow;
import java.util.*;
@SuppressWarnings("DuplicatedCode")
public class NBTEditor {
private final Player player;
private final YamlPage parentPage;
private ConfigurationSection nbtSection;
private ConfigurationSection currentSection;
private String value;
private String currentNode;
public NBTEditor(Player player, YamlPage parentPage, ConfigurationSection section) {
this.player = player;
this.parentPage = parentPage;
this.nbtSection = section.getConfigurationSection("nbt");
if (this.nbtSection == null)
this.nbtSection = section.createSection("nbt");
this.currentSection = nbtSection;
this.currentNode = "";
reOpenMain();
}
public List<Item> getNBTContents() {
Deque<Item> deque = new ArrayDeque<>();
for (Map.Entry<String, Object> entry : currentSection.getValues(false).entrySet()) {
String path = Objects.equals(currentNode, "") ? entry.getKey() : currentNode + "." + entry.getKey();
if (entry.getValue() instanceof List<?> list) {
deque.addLast(new InvListIcon(path));
} else if (entry.getValue() instanceof String str) {
deque.addLast(new InvValueIcon(path, str));
} else if (entry.getValue() instanceof ConfigurationSection inner) {
deque.addFirst(new InvCompoundIcon(path, inner));
} else if (entry.getValue() instanceof Map<?,?> map) {
deque.addLast(new InvMapIcon(path));
}
}
deque.addLast(new NewCompoundIcon());
deque.addLast(new NewListIcon());
deque.addLast(new NewValueIcon());
if (currentSection.getParent() != null && !currentSection.getName().equals("nbt")) {
deque.addLast(new BackToParentIcon());
}
return new ArrayList<>(deque);
}
public void reOpenMain() {
Gui upperGui = Gui.normal()
.setStructure("b b c")
.addIngredient('b', new ItemStack(Material.AIR))
.addIngredient('c', new SaveIcon())
.build();
var gui = PagedGui.items()
.setStructure(
"x x x x x x x x x",
"x x x x x x x x x",
"x x x x x x x x x",
"# # # # c # # # #"
)
.addIngredient('x', Markers.CONTENT_LIST_SLOT_HORIZONTAL)
.addIngredient('c', parentPage.getBackItem())
.addIngredient('#', new BackGroundItem())
.setContent(getNBTContents())
.build();
var window = AnvilWindow.split()
.setViewer(player)
.setTitle(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage("Edit NBT")))
.setUpperGui(upperGui)
.setLowerGui(gui)
.build();
window.open();
}
public void reOpenAddCompound() {
var confirm = new ConfirmCompoundItem();
Gui upperGui = Gui.normal()
.setStructure("a b c")
.addIngredient('a', new ItemBuilder(Material.COMMAND_BLOCK_MINECART).setDisplayName(""))
.addIngredient('b', new ItemStack(Material.AIR))
.addIngredient('c', confirm)
.build();
value = "";
var gui = PagedGui.items()
.setStructure(
"x x x x x x x x x",
"x x x x x x x x x",
"x x x x x x x x x",
"# # # # c # # # #"
)
.addIngredient('x', Markers.CONTENT_LIST_SLOT_HORIZONTAL)
.addIngredient('c', parentPage.getBackItem())
.addIngredient('#', new BackGroundItem())
.setContent(getNBTContents())
.build();
var window = AnvilWindow.split()
.setViewer(player)
.setTitle(new ShadedAdventureComponentWrapper(
AdventureManagerImpl.getInstance().getComponentFromMiniMessage("Edit compound key")
))
.addRenameHandler(s -> {
value = s;
confirm.notifyWindows();
})
.setUpperGui(upperGui)
.setLowerGui(gui)
.build();
window.open();
}
public void reOpenAddList() {
var confirm = new ConfirmListItem();
Gui upperGui = Gui.normal()
.setStructure("a b c")
.addIngredient('a', new ItemBuilder(Material.CHAIN_COMMAND_BLOCK).setDisplayName(""))
.addIngredient('b', new ItemStack(Material.AIR))
.addIngredient('c', confirm)
.build();
value = "";
var gui = PagedGui.items()
.setStructure(
"x x x x x x x x x",
"x x x x x x x x x",
"x x x x x x x x x",
"# # # # c # # # #"
)
.addIngredient('x', Markers.CONTENT_LIST_SLOT_HORIZONTAL)
.addIngredient('c', parentPage.getBackItem())
.addIngredient('#', new BackGroundItem())
.setContent(getNBTContents())
.build();
var window = AnvilWindow.split()
.setViewer(player)
.setTitle(new ShadedAdventureComponentWrapper(
AdventureManagerImpl.getInstance().getComponentFromMiniMessage("Edit list key")
))
.addRenameHandler(s -> {
value = s;
confirm.notifyWindows();
})
.setUpperGui(upperGui)
.setLowerGui(gui)
.build();
window.open();
}
public void reOpenAddValue() {
var confirm =new ConfirmValueItem();
Gui upperGui = Gui.normal()
.setStructure(
"a b c"
)
.addIngredient('a', new ItemBuilder(Material.COMMAND_BLOCK).setDisplayName(""))
.addIngredient('b', new ItemStack(Material.AIR))
.addIngredient('c', confirm)
.build();
value = "";
var gui = PagedGui.items()
.setStructure(
"x x x x x x x x x",
"x x x x x x x x x",
"x x x x x x x x x",
"# # # # c # # # #"
)
.addIngredient('x', Markers.CONTENT_LIST_SLOT_HORIZONTAL)
.addIngredient('c', parentPage.getBackItem())
.addIngredient('#', new BackGroundItem())
.setContent(getNBTContents())
.build();
var window = AnvilWindow.split()
.setViewer(player)
.setTitle(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage("Edit key")))
.addRenameHandler(s -> {
value = s;
confirm.notifyWindows();
})
.setUpperGui(upperGui)
.setLowerGui(gui)
.build();
window.open();
}
public void reOpenSetValue(String key, String type) {
var save = new SaveValueIcon(key);
Gui upperGui = Gui.normal()
.setStructure("a b c")
.addIngredient('a', new ItemBuilder(Material.COMMAND_BLOCK).setDisplayName(type == null ? "" : "(" + type + ") "))
.addIngredient('b', new ItemStack(Material.AIR))
.addIngredient('c', save)
.build();
value = "";
var gui = PagedGui.items()
.setStructure(
"x x x x x x x x x",
"x x x x x x x x x",
"x x x x x x x x x",
"# # # # c # # # #"
)
.addIngredient('x', Markers.CONTENT_LIST_SLOT_HORIZONTAL)
.addIngredient('c', parentPage.getBackItem())
.addIngredient('#', new BackGroundItem())
.setContent(getTypeContents(key))
.build();
var window = AnvilWindow.split()
.setViewer(player)
.setTitle(new ShadedAdventureComponentWrapper(
AdventureManagerImpl.getInstance().getComponentFromMiniMessage("Set value")
))
.addRenameHandler(s -> {
value = s;
save.notifyWindows();
})
.setUpperGui(upperGui)
.setLowerGui(gui)
.build();
window.open();
}
public void removeByNode(String node) {
nbtSection.set(node, null);
parentPage.save();
}
public List<Item> getTypeContents(String key) {
ArrayList<Item> list = new ArrayList<>();
for (Map.Entry<String, String> entry : Map.of(
"String","some text",
"Byte","1",
"Short","123",
"Int","123456",
"Long","123456789",
"Double", "1.2345",
"Float", "1.23",
"Boolean", "true",
"IntArray", "[111,222,333,444]",
"ByteArray","[1,2,3,4]"
).entrySet()) {
list.add(new TypeItem(key, entry.getKey(), entry.getValue()));
}
return list;
}
public class TypeItem extends AbstractItem {
private final String type;
private final String tip;
private final String key;
public TypeItem(String key, String type, String tip) {
this.type = type;
this.tip = tip;
this.key = key;
}
@Override
public ItemProvider getItemProvider() {
return new ItemBuilder(Material.BELL).setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"(" + type + ") " + tip
)));
}
@Override
public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) {
reOpenSetValue(key, type);
}
}
public class ConfirmCompoundItem extends AbstractItem {
@Override
public ItemProvider getItemProvider() {
if (value == null || value.equals("") || value.contains(".") || currentSection.contains(value)) {
return new ItemBuilder(Material.BARRIER).setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<red>Invaild key"
)));
}
return new ItemBuilder(Material.COMMAND_BLOCK_MINECART).setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"New key: " + value
))).addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<#00FF7F> -> Left click to confirm"
))).addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<#00CED1> -> Right click to cancel"
)));
}
@Override
public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) {
if (clickType.isLeftClick()) {
if (value == null || value.equals("") || value.contains(".")) {
return;
}
if (currentSection.contains(value)) {
return;
}
currentSection.createSection(value);
parentPage.save();
}
reOpenMain();
}
}
public class ConfirmListItem extends AbstractItem {
@Override
public ItemProvider getItemProvider() {
if (value == null || value.equals("") || value.contains(".") || currentSection.contains(value)) {
return new ItemBuilder(Material.BARRIER).setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<red>Invaild key"
)));
}
return new ItemBuilder(Material.CHAIN_COMMAND_BLOCK).setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"New key: " + value
))).addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<#00FF7F> -> Left click to confirm"
))).addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<#00CED1> -> Right click to cancel"
)));
}
@Override
public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) {
if (clickType.isLeftClick()) {
if (value == null || value.equals("") || value.contains(".")) {
return;
}
if (currentSection.contains(value)) {
return;
}
currentSection.set(value, new ArrayList<>());
parentPage.save();
}
reOpenMain();
}
}
public class ConfirmValueItem extends AbstractItem {
@Override
public ItemProvider getItemProvider() {
if (value == null || value.equals("") || value.contains(".") || currentSection.contains(value)) {
return new ItemBuilder(Material.BARRIER).setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<red>Invaild key"
)));
}
return new ItemBuilder(Material.COMMAND_BLOCK).setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"New key: " + value
))).addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<#00FF7F> -> Left click to confirm"
))).addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<#00CED1> -> Right click to cancel"
)));
}
@Override
public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) {
if (clickType.isLeftClick()) {
if (value == null || value.equals("") || value.contains(".")) {
return;
}
if (currentSection.contains(value)) {
return;
}
reOpenSetValue(value, null);
} else if (clickType.isRightClick()) {
reOpenMain();
}
}
}
public class NewCompoundIcon extends AbstractItem {
@Override
public ItemProvider getItemProvider() {
return new ItemBuilder(Material.ANVIL).setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"Add a new compound"
)));
}
@Override
public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) {
reOpenAddCompound();
}
}
public class NewListIcon extends AbstractItem {
@Override
public ItemProvider getItemProvider() {
return new ItemBuilder(Material.ANVIL).setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"Add a new list"
)));
}
@Override
public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) {
reOpenAddList();
}
}
public class NewValueIcon extends AbstractItem {
@Override
public ItemProvider getItemProvider() {
return new ItemBuilder(Material.ANVIL).setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"Add a new value"
)));
}
@Override
public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) {
reOpenAddValue();
}
}
public class InvCompoundIcon extends AbstractItem {
private final String node;
private final ConfigurationSection compound;
public InvCompoundIcon(String node, ConfigurationSection compound) {
this.compound = compound;
this.node = node;
}
@Override
public ItemProvider getItemProvider() {
String[] splits = node.split("\\.");
return new ItemBuilder(Material.COMMAND_BLOCK_MINECART).setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"Compound: " + splits[splits.length -1]
))).addLoreLines("")
.addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<#00FF7F> -> Left click to edit"
))).addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<#FF6347> -> Right click to delete"
)));
}
@Override
public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) {
if (clickType.isLeftClick()) {
currentSection = compound;
currentNode = node;
} else if (clickType.isRightClick()) {
removeByNode(node);
}
reOpenMain();
}
}
public class InvValueIcon extends AbstractItem {
private final String node;
private final String value;
public InvValueIcon(String node, String value) {
this.node = node;
this.value = value;
}
@Override
public ItemProvider getItemProvider() {
String[] splits = node.split("\\.");
return new ItemBuilder(Material.REPEATING_COMMAND_BLOCK).setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
splits[splits.length -1] + ": " + value
)))
.addLoreLines("")
.addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<#00FF7F> -> Left click to edit"
))).addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<#FF6347> -> Right click to delete"
)));
}
@Override
public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) {
String[] split = node.split("\\.");
if (clickType.isLeftClick()) {
reOpenSetValue(split[split.length-1], NBTUtils.getTypeAndData(value)[0]);
} else if (clickType.isRightClick()) {
removeByNode(node);
reOpenMain();
}
}
}
public class InvListIcon extends AbstractItem {
private final String node;
public InvListIcon(String node) {
this.node = node;
}
@Override
public ItemProvider getItemProvider() {
String[] splits = node.split("\\.");
return new ItemBuilder(Material.CHAIN_COMMAND_BLOCK).setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"List: " + splits[splits.length -1]
)))
.addLoreLines("")
.addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<#00FF7F> -> <st>Left click to edit</st>"
))).addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<#00FF7F> -> Use text editor instead"
))).addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<#FF6347> -> Right click to delete"
)));
}
@Override
public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) {
if (clickType.isRightClick()) {
removeByNode(node);
reOpenMain();
}
}
}
public class InvMapIcon extends AbstractItem {
private final String node;
public InvMapIcon(String node) {
this.node = node;
}
@Override
public ItemProvider getItemProvider() {
String[] splits = node.split("\\.");
return new ItemBuilder(Material.COMMAND_BLOCK).setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"Map: " + splits[splits.length -1]
)))
.addLoreLines("")
.addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<#00FF7F> -> <st>Left click to edit</st>"
))).addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<#00FF7F> -> Use text editor instead"
))).addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<#FF6347> -> Right click to delete"
)));
}
@Override
public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) {
if (clickType.isRightClick()) {
removeByNode(node);
reOpenMain();
}
}
}
public class SaveValueIcon extends AbstractItem {
private final String key;
public SaveValueIcon(String key) {
this.key = key;
}
@Override
public ItemProvider getItemProvider() {
try {
NBTUtils.getTypeAndData(value);
return new ItemBuilder(Material.COMMAND_BLOCK)
.setDisplayName(value)
.addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<#00FF7F> -> Left click to confirm")))
.addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<#00CED1> -> Right click to cancel")));
} catch (IllegalArgumentException e) {
return new ItemBuilder(Material.BARRIER).setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"Invalid format"
)));
}
}
@Override
public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) {
if (clickType == ClickType.LEFT) {
try {
NBTUtils.getTypeAndData(value);
currentSection.set(key, value);
parentPage.save();
reOpenMain();
} catch (IllegalArgumentException e) {
reOpenMain();
}
} else if (clickType == ClickType.RIGHT) {
reOpenMain();
}
}
}
public class SaveIcon extends AbstractItem {
@Override
public ItemProvider getItemProvider() {
if (nbtSection.getValues(false).size() > 0) {
var builder = new ItemBuilder(Material.ACACIA_SIGN).setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<green>● NBT Preview"
)));
for (String line : ConfigUtils.getReadableSection(nbtSection.getValues(false))) {
builder.addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
line
)));
}
return builder;
} else {
return new ItemBuilder(Material.STRUCTURE_VOID).setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<#00CED1>● Delete property"
)));
}
}
@Override
public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) {
if (nbtSection.getValues(false).size() == 0) {
Objects.requireNonNull(nbtSection.getParent()).set("nbt", null);
}
parentPage.save();
parentPage.reOpen();
}
}
public class BackToParentIcon extends AbstractItem {
@Override
public ItemProvider getItemProvider() {
return new ItemBuilder(Material.MINECART).setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"Back to parent compound"
)));
}
@Override
public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) {
currentSection = currentSection.getParent();
currentNode = currentNode.lastIndexOf(".") == -1 ? "" : currentNode.substring(0, currentNode.lastIndexOf("."));
reOpenMain();
}
}
}

View File

@@ -62,7 +62,6 @@ import org.bukkit.event.player.PlayerItemMendEvent;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.Damageable;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.util.Vector;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

View File

@@ -17,13 +17,9 @@
package net.momirealms.customfishing.mechanic.misc;
import io.papermc.paper.event.player.AsyncChatEvent;
import io.papermc.paper.event.player.ChatEvent;
import net.momirealms.customfishing.api.CustomFishingPlugin;
import net.momirealms.customfishing.api.common.Pair;
import net.momirealms.customfishing.gui.ItemPage;
import net.momirealms.customfishing.gui.ParentPage;
import net.momirealms.customfishing.gui.YamlPage;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;

View File

@@ -305,4 +305,56 @@ public class ConfigUtils {
}
return expression.evaluate();
}
public static ArrayList<String> getReadableSection(Map<String, Object> map) {
ArrayList<String> list = new ArrayList<>();
mapToReadableStringList(map, list, 0, false);
return list;
}
@SuppressWarnings("unchecked")
public static void mapToReadableStringList(Map<String, Object> map, List<String> readableList, int loop_times, boolean isMapList) {
boolean first = true;
for (Map.Entry<String, Object> entry : map.entrySet()) {
Object nbt = entry.getValue();
if (nbt instanceof String value) {
if (isMapList && first) {
first = false;
readableList.add(" ".repeat(loop_times - 1) + "<white>- <gold>" + entry.getKey() + ": <white>" + value);
} else {
readableList.add(" ".repeat(loop_times) + "<gold>" + entry.getKey() + ": <white>" + value);
}
} else if (nbt instanceof List<?> list) {
if (isMapList && first) {
first = false;
readableList.add(" ".repeat(loop_times - 1) + "<white>- <gold>" + entry.getKey() + ":");
} else {
readableList.add(" ".repeat(loop_times) + "<gold>" + entry.getKey() + ":");
}
for (Object value : list) {
if (value instanceof Map<?,?> nbtMap) {
mapToReadableStringList((Map<String, Object>) nbtMap, readableList, loop_times + 2, true);
} else {
readableList.add(" ".repeat(loop_times + 1) + "<white>- " + value);
}
}
} else if (nbt instanceof ConfigurationSection section) {
if (isMapList && first) {
first = false;
readableList.add(" ".repeat(loop_times - 1) + "<white>- <gold>" + entry.getKey() + ":");
} else {
readableList.add(" ".repeat(loop_times) + "<gold>" + entry.getKey() + ":");
}
mapToReadableStringList(section.getValues(false), readableList, loop_times + 1, false);
} else if (nbt instanceof Map<?,?> innerMap) {
if (isMapList && first) {
first = false;
readableList.add(" ".repeat(loop_times - 1) + "<white>- <gold>" + entry.getKey() + ":");
} else {
readableList.add(" ".repeat(loop_times) + "<gold>" + entry.getKey() + ":");
}
mapToReadableStringList((Map<String, Object>) innerMap, readableList, loop_times + 1, false);
}
}
}
}

View File

@@ -154,12 +154,12 @@ public class NBTUtils {
case NBTTagByteArray -> map.put(key, "(ByteArray) " + Arrays.toString(nbtCompound.getByteArray(key)));
case NBTTagIntArray -> map.put(key, "(IntArray) " + Arrays.toString(nbtCompound.getIntArray(key)));
case NBTTagCompound -> {
Map<String, Object> map1 = compoundToMap(nbtCompound.getCompound(key));
Map<String, Object> map1 = compoundToMap(Objects.requireNonNull(nbtCompound.getCompound(key)));
if (map1.size() != 0) map.put(key, map1);
}
case NBTTagList -> {
List<Object> list = new ArrayList<>();
switch (nbtCompound.getListType(key)) {
switch (Objects.requireNonNull(nbtCompound.getListType(key))) {
case NBTTagCompound -> nbtCompound.getCompoundList(key).forEach(a -> list.add(compoundToMap(a)));
case NBTTagInt -> nbtCompound.getIntegerList(key).forEach(a -> list.add("(Int) " + a));
case NBTTagDouble -> nbtCompound.getDoubleList(key).forEach(a -> list.add("(Double) " + a));
@@ -181,8 +181,11 @@ public class NBTUtils {
* @param str The input value string
* @return An array containing type and data strings
*/
private static String[] getTypeAndData(String str) {
public static String[] getTypeAndData(String str) {
String[] parts = str.split("\\s+", 2);
if (parts.length == 1) {
return new String[]{"String", str};
}
if (parts.length != 2) {
throw new IllegalArgumentException("Invalid value format: " + str);
}
@@ -197,7 +200,7 @@ public class NBTUtils {
* @param value The input value containing arrays
* @return An array of individual elements
*/
private static String[] splitValue(String value) {
public static String[] splitValue(String value) {
return value.substring(value.indexOf('[') + 1, value.lastIndexOf(']'))
.replaceAll("\\s", "")
.split(",");