9
0
mirror of https://github.com/Xiao-MoMi/Custom-Fishing.git synced 2025-12-19 15:09:24 +00:00
This commit is contained in:
XiaoMoMi
2023-10-09 18:48:29 +08:00
parent 35d66b12e1
commit 5f13aedd3b
25 changed files with 889 additions and 45 deletions

View File

@@ -133,6 +133,8 @@ public interface ItemManager {
@Nullable
BuildableItem getBuildableItem(String namespace, String value);
ItemStack getItemStackAppearance(Player player, String material);
/**
* Register an item library.
*

View File

@@ -2,7 +2,7 @@ package net.momirealms.customfishing.command.sub;
import dev.jorel.commandapi.CommandAPICommand;
import net.momirealms.customfishing.api.CustomFishingPlugin;
import net.momirealms.customfishing.gui.SelectFileGUI;
import net.momirealms.customfishing.gui.page.file.FileSelector;
import java.io.File;
@@ -13,7 +13,7 @@ public class GUIEditorCommand {
public CommandAPICommand getEditorCommand() {
return new CommandAPICommand("edit")
.executesPlayer((player, arg) -> {
new SelectFileGUI(player, new File(CustomFishingPlugin.get().getDataFolder(), "contents"));
new FileSelector(player, new File(CustomFishingPlugin.get().getDataFolder(), "contents"));
});
}
}

View File

@@ -36,10 +36,10 @@ public class ItemsAdderEntityImpl implements EntityLibrary {
CustomEntity customEntity = CustomEntity.spawn(
id,
location,
(Boolean) propertyMap.get("frustumCulling"),
(Boolean) propertyMap.get("noBase"),
(Boolean) propertyMap.get("noHitbox")
(Boolean) propertyMap.getOrDefault("frustumCulling", true),
(Boolean) propertyMap.getOrDefault("noBase", false),
(Boolean) propertyMap.getOrDefault("noHitbox", false)
);
return customEntity.getEntity();
}
}
}

View File

@@ -0,0 +1,4 @@
package net.momirealms.customfishing.gui;
public interface Icon {
}

View File

@@ -0,0 +1,8 @@
package net.momirealms.customfishing.gui;
import org.bukkit.configuration.ConfigurationSection;
public interface ItemPage extends YamlPage {
ConfigurationSection getSection();
}

View File

@@ -0,0 +1,13 @@
package net.momirealms.customfishing.gui;
import net.momirealms.customfishing.gui.icon.BackToPageItem;
import xyz.xenondevs.invui.item.Item;
public interface ParentPage {
void reOpen();
default Item getBackItem() {
return new BackToPageItem(this);
}
}

View File

@@ -0,0 +1,6 @@
package net.momirealms.customfishing.gui;
public interface YamlPage extends ParentPage {
void save();
}

View File

@@ -1,5 +1,6 @@
package net.momirealms.customfishing.gui.icon;
import net.momirealms.customfishing.gui.Icon;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.ClickType;
@@ -13,7 +14,7 @@ public class BackGroundItem extends AbstractItem implements Icon {
@Override
public ItemProvider getItemProvider() {
return new ItemBuilder(Material.BLACK_STAINED_GLASS_PANE);
return new ItemBuilder(Material.BLACK_STAINED_GLASS_PANE).setDisplayName("");
}
@Override

View File

@@ -2,7 +2,8 @@ package net.momirealms.customfishing.gui.icon;
import net.momirealms.customfishing.adventure.AdventureManagerImpl;
import net.momirealms.customfishing.adventure.component.ShadedAdventureComponentWrapper;
import net.momirealms.customfishing.gui.SelectFileGUI;
import net.momirealms.customfishing.gui.Icon;
import net.momirealms.customfishing.gui.page.file.FileSelector;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.ClickType;
@@ -15,7 +16,7 @@ import xyz.xenondevs.invui.item.impl.AbstractItem;
import java.io.File;
import java.util.List;
public class BackToFolderItem extends AbstractItem implements Icon {
public class BackToFolderItem extends AbstractItem implements Icon {
private final File file;
@@ -41,6 +42,6 @@ public class BackToFolderItem extends AbstractItem implements Icon {
@Override
public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) {
if (file != null && file.getPath().startsWith("plugins\\CustomFishing\\contents"))
new SelectFileGUI(player, file);
new FileSelector(player, file);
}
}

View File

@@ -0,0 +1,35 @@
package net.momirealms.customfishing.gui.icon;
import net.momirealms.customfishing.adventure.AdventureManagerImpl;
import net.momirealms.customfishing.adventure.component.ShadedAdventureComponentWrapper;
import net.momirealms.customfishing.gui.ParentPage;
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 BackToPageItem extends AbstractItem {
private final ParentPage parentPage;
public BackToPageItem(ParentPage parentPage) {
this.parentPage = parentPage;
}
@Override
public ItemProvider getItemProvider() {
return new ItemBuilder(Material.ORANGE_STAINED_GLASS_PANE)
.setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<#FF8C00>Back to parent page"
)));
}
@Override
public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) {
parentPage.reOpen();
}
}

View File

@@ -1,4 +0,0 @@
package net.momirealms.customfishing.gui.icon;
public interface Icon {
}

View File

@@ -1,5 +1,6 @@
package net.momirealms.customfishing.gui.icon;
import net.momirealms.customfishing.gui.Icon;
import org.bukkit.Material;
import xyz.xenondevs.invui.gui.PagedGui;
import xyz.xenondevs.invui.item.ItemProvider;

View File

@@ -1,5 +1,6 @@
package net.momirealms.customfishing.gui.icon;
import net.momirealms.customfishing.gui.Icon;
import org.bukkit.Material;
import xyz.xenondevs.invui.gui.PagedGui;
import xyz.xenondevs.invui.item.ItemProvider;

View File

@@ -1,5 +1,6 @@
package net.momirealms.customfishing.gui.icon;
import net.momirealms.customfishing.gui.Icon;
import org.bukkit.Material;
import xyz.xenondevs.invui.gui.ScrollGui;
import xyz.xenondevs.invui.item.ItemProvider;

View File

@@ -1,5 +1,6 @@
package net.momirealms.customfishing.gui.icon;
import net.momirealms.customfishing.gui.Icon;
import org.bukkit.Material;
import xyz.xenondevs.invui.gui.ScrollGui;
import xyz.xenondevs.invui.item.ItemProvider;

View File

@@ -0,0 +1,60 @@
package net.momirealms.customfishing.gui.icon.property;
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.CustomModelDataEditor;
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 CMDItem extends AbstractItem {
private final ItemPage itemPage;
public CMDItem(ItemPage itemPage) {
this.itemPage = itemPage;
}
@Override
public ItemProvider getItemProvider() {
ItemBuilder itemBuilder = new ItemBuilder(Material.GLOW_INK_SAC)
.setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<#FFC0CB>● Custom Model Data"
)));
if (itemPage.getSection().contains("custom-model-data")) {
itemBuilder.addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<gray>Current value: <white>" + itemPage.getSection().getInt("custom-model-data")
)))
.addLoreLines("");
itemBuilder.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 CustomModelDataEditor(player, itemPage, itemPage.getSection().getString("material", ""), itemPage.getSection());
} else if (clickType.isRightClick()) {
itemPage.getSection().set("custom-model-data", null);
itemPage.save();
itemPage.reOpen();
}
}
}

View File

@@ -0,0 +1,60 @@
package net.momirealms.customfishing.gui.icon.property;
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.DisplayNameEditor;
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 DisplayNameItem extends AbstractItem {
private final ItemPage itemPage;
public DisplayNameItem(ItemPage itemPage) {
this.itemPage = itemPage;
}
@Override
public ItemProvider getItemProvider() {
ItemBuilder itemBuilder = new ItemBuilder(Material.NAME_TAG)
.setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<#FAFAD2>● Display Name"
)));
if (itemPage.getSection().contains("display.name")) {
itemBuilder.addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<gray>Current value: </gray>" + itemPage.getSection().getString("display.name")
)))
.addLoreLines("");
itemBuilder.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 DisplayNameEditor(player, itemPage, itemPage.getSection());
} else if (clickType.isRightClick()) {
itemPage.getSection().set("display.name", null);
itemPage.save();
itemPage.reOpen();
}
}
}

View File

@@ -0,0 +1,65 @@
package net.momirealms.customfishing.gui.icon.property;
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.LoreEditor;
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 LoreItem extends AbstractItem {
private final ItemPage itemPage;
public LoreItem(ItemPage itemPage) {
this.itemPage = itemPage;
}
@Override
public ItemProvider getItemProvider() {
ItemBuilder itemBuilder = new ItemBuilder(Material.BIRCH_SIGN)
.setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<#FA8072>● Lore"
)));
if (itemPage.getSection().contains("display.lore")) {
itemBuilder.addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<gray>Current value: </gray>"
)));
for (String lore : itemPage.getSection().getStringList("display.lore")) {
itemBuilder.addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
" <gray>-</gray> " + lore
)));
}
itemBuilder.addLoreLines("");
itemBuilder.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 LoreEditor(player, itemPage, itemPage.getSection());
} else if (clickType.isRightClick()) {
itemPage.getSection().set("display.lore", null);
itemPage.save();
itemPage.reOpen();
}
}
}

View File

@@ -1,8 +1,13 @@
package net.momirealms.customfishing.gui;
package net.momirealms.customfishing.gui.page.file;
import net.momirealms.customfishing.adventure.AdventureManagerImpl;
import net.momirealms.customfishing.adventure.component.ShadedAdventureComponentWrapper;
import net.momirealms.customfishing.gui.icon.*;
import net.momirealms.customfishing.gui.Icon;
import net.momirealms.customfishing.gui.icon.BackGroundItem;
import net.momirealms.customfishing.gui.icon.BackToFolderItem;
import net.momirealms.customfishing.gui.icon.ScrollDownItem;
import net.momirealms.customfishing.gui.icon.ScrollUpItem;
import net.momirealms.customfishing.gui.page.item.ItemSelector;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.ClickType;
@@ -23,9 +28,9 @@ import java.io.File;
import java.util.ArrayDeque;
import java.util.Deque;
public class SelectFileGUI {
public class FileSelector {
public SelectFileGUI(Player player, File folder) {
public FileSelector(Player player, File folder) {
File[] files = folder.listFiles();
Deque<Item> items = new ArrayDeque<>();
if (files != null) {
@@ -94,7 +99,7 @@ public class SelectFileGUI {
String type = split[3];
switch (type) {
case "item" -> {
new ItemEditor(player, file);
new ItemSelector(player, file);
}
}
}
@@ -117,7 +122,7 @@ public class SelectFileGUI {
@Override
public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) {
new SelectFileGUI(player, file);
new FileSelector(player, file);
}
}
}

View File

@@ -0,0 +1,116 @@
package net.momirealms.customfishing.gui.page.item;
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.icon.BackGroundItem;
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.CMDItem;
import net.momirealms.customfishing.gui.icon.property.DisplayNameItem;
import net.momirealms.customfishing.gui.icon.property.LoreItem;
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.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.item.impl.SimpleItem;
import xyz.xenondevs.invui.window.AnvilWindow;
import java.util.ArrayList;
import java.util.List;
public class ItemEditor implements ItemPage {
private final Player player;
private final ItemSelector itemSelector;
private final ConfigurationSection section;
private final String key;
public ItemEditor(Player player, String key, ItemSelector itemSelector, ConfigurationSection section) {
this.player = player;
this.section = section;
this.itemSelector = itemSelector;
this.key = key;
this.reOpen();
}
@Override
public void reOpen() {
Item border = new SimpleItem(new ItemBuilder(Material.AIR));
Gui upperGui = Gui.normal()
.setStructure(
"# a #"
)
.addIngredient('a', new RefreshExample())
.addIngredient('#', border)
.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",
"# # a # c # b # #"
)
.addIngredient('x', Markers.CONTENT_LIST_SLOT_HORIZONTAL)
.addIngredient('#', new BackGroundItem())
.addIngredient('a', new PreviousPageItem())
.addIngredient('b', new NextPageItem())
.addIngredient('c', new BackToPageItem(itemSelector))
.setContent(getItemList())
.build();
var window = AnvilWindow.split()
.setViewer(player)
.setTitle(new ShadedAdventureComponentWrapper(
AdventureManagerImpl.getInstance().getComponentFromMiniMessage("Editing " + key)
))
.setUpperGui(upperGui)
.setLowerGui(gui)
.build();
window.open();
}
@Override
public void save() {
itemSelector.save();
}
public class RefreshExample extends AbstractItem {
@Override
public ItemProvider getItemProvider() {
return new ItemBuilder(CustomFishingPlugin.get().getItemManager().getItemBuilder(section, "item", key).build(player));
}
@Override
public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) {
notifyWindows();
}
}
public List<Item> getItemList() {
ArrayList<Item> items = new ArrayList<>();
items.add(new DisplayNameItem(this));
items.add(new LoreItem(this));
items.add(new CMDItem(this));
return items;
}
@Override
public ConfigurationSection getSection() {
return section;
}
}

View File

@@ -1,9 +1,10 @@
package net.momirealms.customfishing.gui;
package net.momirealms.customfishing.gui.page.item;
import net.momirealms.customfishing.adventure.AdventureManagerImpl;
import net.momirealms.customfishing.adventure.component.ShadedAdventureComponentWrapper;
import net.momirealms.customfishing.api.CustomFishingPlugin;
import net.momirealms.customfishing.api.util.LogUtils;
import net.momirealms.customfishing.gui.YamlPage;
import net.momirealms.customfishing.gui.icon.BackGroundItem;
import net.momirealms.customfishing.gui.icon.BackToFolderItem;
import net.momirealms.customfishing.gui.icon.NextPageItem;
@@ -33,29 +34,35 @@ import java.util.List;
import java.util.Locale;
import java.util.Map;
public class ItemEditor {
public class ItemSelector implements YamlPage {
private static final String SEARCH = "Search";
public static final String SEARCH = "Search";
private final Player player;
private final YamlConfiguration yaml;
private String prefix;
private final File file;
private long coolDown;
public ItemEditor(Player player, File file) {
public ItemSelector(Player player, File file) {
this.yaml = YamlConfiguration.loadConfiguration(file);
this.player = player;
this.file = file;
this.prefix = SEARCH;
this.reOpenWithFilter();
this.reOpenWithFilter(SEARCH);
}
public void reOpenWithFilter() {
@Override
public void reOpen() {
reOpenWithFilter(prefix);
}
public void reOpenWithFilter(String filter) {
Item border = new SimpleItem(new ItemBuilder(Material.AIR));
Gui upperGui = Gui.normal()
.setStructure(
"a # #"
)
.addIngredient('a', new SimpleItem(new ItemBuilder(Material.NAME_TAG).setDisplayName(prefix)))
.addIngredient('a', new SimpleItem(new ItemBuilder(Material.NAME_TAG).setDisplayName(filter)))
.addIngredient('#', border)
.build();
@@ -74,16 +81,18 @@ public class ItemEditor {
.setContent(getItemList())
.build();
var temp = prefix;
var window = AnvilWindow.split()
.setViewer(player)
.setTitle(new ShadedAdventureComponentWrapper(
AdventureManagerImpl.getInstance().getComponentFromMiniMessage("Select item to edit")
))
.addRenameHandler(s -> {
if (s.equals(temp)) return;
long current = System.currentTimeMillis();
if (current - coolDown < 100) return;
if (s.equals(filter)) return;
prefix = s;
reOpenWithFilter();
coolDown = current;
reOpenWithFilter(s);
})
.setUpperGui(upperGui)
.setLowerGui(gui)
@@ -126,6 +135,7 @@ public class ItemEditor {
yaml.set(key, null);
}
@Override
public void save() {
try {
yaml.save(file);
@@ -138,33 +148,34 @@ public class ItemEditor {
private final String key;
private final ItemBuilder itemBuilder;
private final ItemEditor itemEditor;
private final ItemSelector itemSelector;
public ItemInList(String key, ItemBuilder itemBuilder, ItemEditor itemEditor) {
public ItemInList(String key, ItemBuilder itemBuilder, ItemSelector itemSelector) {
this.key = key;
this.itemBuilder = itemBuilder;
this.itemEditor = itemEditor;
this.itemBuilder = itemBuilder.setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
key
))).addLoreLines("")
.addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<#00FF7F> -> Left click to edit"
))).addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<#FF6347> -> Right click to delete"
)));
this.itemSelector = itemSelector;
}
@Override
public ItemProvider getItemProvider() {
return itemBuilder.setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
key
))).addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<green>Left click to edit"
))).addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<red>Right click to delete"
)));
return itemBuilder;
}
@Override
public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) {
if (clickType.isLeftClick()) {
new ItemEditor(player, key, itemSelector, itemSelector.yaml.getConfigurationSection(key));
} else if (clickType.isRightClick()) {
this.itemEditor.removeKey(key);
this.itemEditor.save();
this.itemEditor.reOpenWithFilter();
this.itemSelector.removeKey(key);
this.itemSelector.save();
this.itemSelector.reOpenWithFilter(itemSelector.prefix);
}
}
}

View File

@@ -0,0 +1,137 @@
package net.momirealms.customfishing.gui.page.property;
import net.momirealms.customfishing.adventure.AdventureManagerImpl;
import net.momirealms.customfishing.adventure.component.ShadedAdventureComponentWrapper;
import net.momirealms.customfishing.api.CustomFishingPlugin;
import net.momirealms.customfishing.gui.YamlPage;
import net.momirealms.customfishing.gui.icon.BackGroundItem;
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.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.item.impl.SimpleItem;
import xyz.xenondevs.invui.window.AnvilWindow;
public class CustomModelDataEditor {
private final Player player;
private final YamlPage parentPage;
private String cmd;
private final ConfigurationSection section;
private final String material;
public CustomModelDataEditor(Player player, YamlPage parentPage, String material, ConfigurationSection section) {
this.player = player;
this.parentPage = parentPage;
this.section = section;
this.material = material;
Item border = new SimpleItem(new ItemBuilder(Material.AIR));
var confirm = new ConfirmIcon();
Gui upperGui = Gui.normal()
.setStructure(
"a # b"
)
.addIngredient('a', new ItemBuilder(CustomFishingPlugin.get()
.getItemManager()
.getItemStackAppearance(player, material)
)
.setCustomModelData(section.getInt("custom-model-data", 0))
.setDisplayName(String.valueOf(section.getInt("custom-model-data", 0))))
.addIngredient('#', border)
.addIngredient('b', confirm)
.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', new ItemStack(Material.AIR))
.addIngredient('c', parentPage.getBackItem())
.addIngredient('#', new BackGroundItem())
.build();
var window = AnvilWindow.split()
.setViewer(player)
.setTitle(new ShadedAdventureComponentWrapper(
AdventureManagerImpl.getInstance().getComponentFromMiniMessage("Edit CustomModelData")
))
.addRenameHandler(s -> {
cmd = s;
confirm.notifyWindows();
})
.setUpperGui(upperGui)
.setLowerGui(gui)
.build();
window.open();
}
public class ConfirmIcon extends AbstractItem {
@Override
public ItemProvider getItemProvider() {
if (cmd == null || cmd.isEmpty()) {
return new ItemBuilder(Material.STRUCTURE_VOID).setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<#00CED1>● Delete property"
)));
} else {
try {
int value = Integer.parseInt(cmd);
if (value >= 0) {
return new ItemBuilder(
CustomFishingPlugin.get()
.getItemManager()
.getItemStackAppearance(player, material)
)
.setCustomModelData(value)
.setDisplayName("New value: " + value)
.addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<#00FF7F> -> Click to confirm"
)));
} else {
return new ItemBuilder(Material.BARRIER).setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<red>● Invalid number"
)));
}
} catch (NumberFormatException e) {
return new ItemBuilder(Material.BARRIER).setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<red>● Invalid number"
)));
}
}
}
@Override
public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) {
if (cmd == null || cmd.isEmpty()) {
section.set("custom-model-data", null);
} else {
try {
int value = Integer.parseInt(cmd);
if (value >= 0) {
section.set("custom-model-data", value);
} else {
return;
}
} catch (NumberFormatException e) {
return;
}
}
parentPage.reOpen();
parentPage.save();
}
}
}

View File

@@ -0,0 +1,104 @@
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 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.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.item.impl.SimpleItem;
import xyz.xenondevs.invui.window.AnvilWindow;
public class DisplayNameEditor {
private final Player player;
private final YamlPage parentPage;
private String name;
private final ConfigurationSection section;
public DisplayNameEditor(Player player, YamlPage parentPage, ConfigurationSection section) {
this.player = player;
this.parentPage = parentPage;
this.section = section;
Item border = new SimpleItem(new ItemBuilder(Material.AIR));
var confirm = new ConfirmIcon();
Gui upperGui = Gui.normal()
.setStructure(
"a # b"
)
.addIngredient('a', new ItemBuilder(Material.NAME_TAG).setDisplayName(section.getString("display.name", "New Name")))
.addIngredient('#', border)
.addIngredient('b', confirm)
.build();
var gui = PagedGui.items()
.setStructure(
"x x x x x x x x x",
"x x x x a x x x x",
"x x x x x x x x x",
"# # # # c # # # #"
)
.addIngredient('x', new ItemStack(Material.AIR))
.addIngredient('c', parentPage.getBackItem())
.addIngredient('#', new BackGroundItem())
.build();
var window = AnvilWindow.split()
.setViewer(player)
.setTitle(new ShadedAdventureComponentWrapper(
AdventureManagerImpl.getInstance().getComponentFromMiniMessage("Edit Display Name")
))
.addRenameHandler(s -> {
name = s;
confirm.notifyWindows();
})
.setUpperGui(upperGui)
.setLowerGui(gui)
.build();
window.open();
}
public class ConfirmIcon extends AbstractItem {
@Override
public ItemProvider getItemProvider() {
if (name == null || name.isEmpty()) {
return new ItemBuilder(Material.STRUCTURE_VOID).setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<#00CED1>● Delete property"
)));
} else {
return new ItemBuilder(Material.NAME_TAG)
.setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
name
)))
.addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<#00FF7F> -> Click to confirm"
)));
}
}
@Override
public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) {
if (name == null || name.isEmpty()) {
section.set("display.name", null);
} else {
section.set("display.name", name);
}
parentPage.reOpen();
parentPage.save();
}
}
}

View File

@@ -0,0 +1,184 @@
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 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.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.item.impl.SimpleItem;
import xyz.xenondevs.invui.window.AnvilWindow;
import java.util.ArrayList;
import java.util.List;
public class LoreEditor {
private final Player player;
private final YamlPage parentPage;
private final ArrayList<String> lore;
private final ConfigurationSection section;
private int index;
public LoreEditor(Player player, YamlPage parentPage, ConfigurationSection section) {
this.player = player;
this.parentPage = parentPage;
this.section = section;
this.index = 0;
this.lore = new ArrayList<>(section.getStringList("display.lore"));
this.lore.add(0, "Select one line");
reOpen(0);
}
public void reOpen(int idx) {
Item border = new SimpleItem(new ItemBuilder(Material.AIR));
var confirm = new ConfirmIcon();
Gui upperGui = Gui.normal()
.setStructure(
"a # b"
)
.addIngredient('a', new ItemBuilder(Material.NAME_TAG).setDisplayName(lore.get(idx)))
.addIngredient('#', border)
.addIngredient('b', confirm)
.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(getContents())
.build();
var window = AnvilWindow.split()
.setViewer(player)
.setTitle(new ShadedAdventureComponentWrapper(
AdventureManagerImpl.getInstance().getComponentFromMiniMessage("Edit Lore")
))
.addRenameHandler(s -> {
if (index == 0) return;
lore.set(index, s);
confirm.notifyWindows();
})
.setUpperGui(upperGui)
.setLowerGui(gui)
.build();
window.open();
}
public List<Item> getContents() {
ArrayList<Item> items = new ArrayList<>();
int i = 1;
List<String> subList = lore.subList(1, lore.size());
for (String lore : subList) {
items.add(new LoreElement(lore, i++));
}
items.add(new AddLore());
return items;
}
public class AddLore extends AbstractItem {
@Override
public ItemProvider getItemProvider() {
return new ItemBuilder(Material.ANVIL).setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<green>[+] <gray>Add a new line"
)));
}
@Override
public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) {
lore.add("Text");
index = lore.size() - 1;
reOpen(index);
}
}
public class LoreElement extends AbstractItem {
private final String line;
private final int idx;
public LoreElement(String line, int idx) {
this.line = line;
this.idx = idx;
}
@Override
public ItemProvider getItemProvider() {
return new ItemBuilder(Material.PAPER).setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
line
))).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 == ClickType.LEFT) {
index = idx;
reOpen(idx);
} else if (clickType == ClickType.RIGHT) {
lore.remove(idx);
index = Math.min(index, lore.size() - 1);
reOpen(index);
}
}
}
public class ConfirmIcon extends AbstractItem {
@Override
public ItemProvider getItemProvider() {
List<String> subList = lore.subList(1, lore.size());
if (subList.isEmpty()) {
return new ItemBuilder(Material.STRUCTURE_VOID).setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<#00CED1>● Delete property"
)));
} else {
var builder = new ItemBuilder(Material.NAME_TAG)
.setDisplayName(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
"<#00FF7F> -> Click to confirm"
)));
for (String lore : subList) {
builder.addLoreLines(new ShadedAdventureComponentWrapper(AdventureManagerImpl.getInstance().getComponentFromMiniMessage(
" <gray>-</gray> " + lore
)));
}
return builder;
}
}
@Override
public void handleClick(@NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) {
List<String> subList = lore.subList(1, lore.size());
if (lore.isEmpty()) {
section.set("display.lore", null);
} else {
section.set("display.lore", subList);
}
parentPage.reOpen();
parentPage.save();
}
}
}

View File

@@ -62,6 +62,7 @@ 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;
@@ -358,6 +359,37 @@ public class ItemManagerImpl implements ItemManager, Listener {
return nbtItem.getItem();
}
@Override
public ItemStack getItemStackAppearance(Player player, String material) {
if (material != null) {
if (material.contains(":")) {
ItemStack itemStack = buildAnyPluginItemByID(player, material);
if (itemStack != null) {
ItemStack stack = new ItemStack(itemStack.getType());
ItemMeta meta = stack.getItemMeta();
meta.setCustomModelData(itemStack.getItemMeta().getCustomModelData());
stack.setItemMeta(meta);
return stack;
} else {
return new ItemStack(Material.BARRIER);
}
} else {
try {
var m = Material.valueOf(material.toUpperCase(Locale.ENGLISH));
if (m.isItem()) {
return new ItemStack(m);
} else {
return new ItemStack(Material.BARRIER);
}
} catch (IllegalArgumentException e) {
return new ItemStack(Material.BARRIER);
}
}
} else {
return new ItemStack(Material.STRUCTURE_VOID);
}
}
/**
* Register an item library.
*