mirror of
https://github.com/HibiscusMC/HMCCosmetics.git
synced 2025-12-25 18:09:27 +00:00
Added dyeing menu
This commit is contained in:
16
.idea/modules/HMCCosmetics.main.iml
generated
Normal file
16
.idea/modules/HMCCosmetics.main.iml
generated
Normal file
@@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module version="4">
|
||||
<component name="FacetManager">
|
||||
<facet type="minecraft" name="Minecraft">
|
||||
<configuration>
|
||||
<autoDetectTypes>
|
||||
<platformType>MCP</platformType>
|
||||
<platformType>ADVENTURE</platformType>
|
||||
</autoDetectTypes>
|
||||
</configuration>
|
||||
</facet>
|
||||
</component>
|
||||
<component name="McpModuleSettings">
|
||||
<option name="srgType" value="SRG" />
|
||||
</component>
|
||||
</module>
|
||||
12
.idea/modules/HMCCosmetics.test.iml
generated
Normal file
12
.idea/modules/HMCCosmetics.test.iml
generated
Normal file
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module version="4">
|
||||
<component name="FacetManager">
|
||||
<facet type="minecraft" name="Minecraft">
|
||||
<configuration>
|
||||
<autoDetectTypes>
|
||||
<platformType>ADVENTURE</platformType>
|
||||
</autoDetectTypes>
|
||||
</configuration>
|
||||
</facet>
|
||||
</component>
|
||||
</module>
|
||||
@@ -76,11 +76,9 @@ public class CosmeticsCommand extends CommandBase {
|
||||
case BACKPACK -> user.getPlayerArmor().getBackpack();
|
||||
};
|
||||
|
||||
new DyeSelectorGui("test", 3, Map.of(
|
||||
10, Color.fromRGB(1, 2, 3),
|
||||
11, Color.fromRGB(0, 0, 255)
|
||||
), armorItem
|
||||
).getGui(user).open(player);
|
||||
player.sendMessage("Opening dye menu");
|
||||
|
||||
this.cosmeticsMenu.openDyeSelectorGui(user, armorItem);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,94 @@
|
||||
package io.github.fisher2911.hmccosmetics.config;
|
||||
|
||||
import dev.triumphteam.gui.guis.GuiItem;
|
||||
import io.github.fisher2911.hmccosmetics.HMCCosmetics;
|
||||
import io.github.fisher2911.hmccosmetics.gui.ColorItem;
|
||||
import io.github.fisher2911.hmccosmetics.gui.DyeSelectorGui;
|
||||
import org.bukkit.Color;
|
||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
import org.spongepowered.configurate.ConfigurationNode;
|
||||
import org.spongepowered.configurate.serialize.SerializationException;
|
||||
import org.spongepowered.configurate.serialize.TypeSerializer;
|
||||
|
||||
import java.lang.reflect.Type;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class DyeGuiSerializer implements TypeSerializer<DyeSelectorGui> {
|
||||
|
||||
private static final HMCCosmetics plugin;
|
||||
|
||||
static {
|
||||
plugin = HMCCosmetics.getPlugin(HMCCosmetics.class);
|
||||
}
|
||||
|
||||
public static final DyeGuiSerializer INSTANCE = new DyeGuiSerializer();
|
||||
|
||||
private DyeGuiSerializer() {}
|
||||
|
||||
private static final String TITLE = "title";
|
||||
private static final String ROWS = "rows";
|
||||
private static final String ITEMS = "items";
|
||||
private static final String SET_COLOR = "set-color";
|
||||
private static final String RED = "red";
|
||||
private static final String GREEN = "green";
|
||||
private static final String BLUE = "blue";
|
||||
|
||||
private ConfigurationNode nonVirtualNode(final ConfigurationNode source, final Object... path) throws SerializationException {
|
||||
if (!source.hasChild(path)) {
|
||||
throw new SerializationException("Required field " + Arrays.toString(path) + " was not present in node");
|
||||
}
|
||||
return source.node(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DyeSelectorGui deserialize(final Type type, final ConfigurationNode source) throws SerializationException {
|
||||
final ConfigurationNode titleNode = this.nonVirtualNode(source, TITLE);
|
||||
final ConfigurationNode rowsNode = this.nonVirtualNode(source, ROWS);
|
||||
final ConfigurationNode itemsNode = source.node(ITEMS);
|
||||
|
||||
|
||||
final Map<Integer, GuiItem> guiItemMap = new HashMap<>();
|
||||
|
||||
final var map = itemsNode.childrenMap();
|
||||
|
||||
for (final var entry : map.entrySet()) {
|
||||
if (!(entry.getKey() instanceof final Integer slot)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
final var node = entry.getValue();
|
||||
|
||||
final GuiItem guiItem = ItemSerializer.INSTANCE.deserialize(
|
||||
GuiItem.class,
|
||||
node
|
||||
);
|
||||
|
||||
final ConfigurationNode colorNode = node.node(SET_COLOR);
|
||||
|
||||
if (colorNode.virtual()) {
|
||||
guiItemMap.put(slot, guiItem);
|
||||
continue;
|
||||
}
|
||||
|
||||
final int red = colorNode.node(RED).getInt();
|
||||
final int green = colorNode.node(GREEN).getInt();
|
||||
final int blue = colorNode.node(BLUE).getInt();
|
||||
|
||||
guiItemMap.put(slot, new ColorItem(guiItem.getItemStack(), Color.fromRGB(red, green, blue)));
|
||||
}
|
||||
|
||||
return new DyeSelectorGui(
|
||||
plugin,
|
||||
titleNode.getString(),
|
||||
rowsNode.getInt(),
|
||||
guiItemMap);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void serialize(final Type type, @Nullable final DyeSelectorGui obj, final ConfigurationNode node) throws SerializationException {
|
||||
|
||||
}
|
||||
}
|
||||
@@ -3,11 +3,13 @@ package io.github.fisher2911.hmccosmetics.config;
|
||||
import dev.triumphteam.gui.guis.GuiItem;
|
||||
import io.github.fisher2911.hmccosmetics.HMCCosmetics;
|
||||
import io.github.fisher2911.hmccosmetics.gui.ArmorItem;
|
||||
import io.github.fisher2911.hmccosmetics.message.Adventure;
|
||||
import io.github.fisher2911.hmccosmetics.util.StringUtils;
|
||||
import io.github.fisher2911.hmccosmetics.util.Utils;
|
||||
import io.github.fisher2911.hmccosmetics.util.builder.ItemBuilder;
|
||||
import io.github.fisher2911.hmccosmetics.util.builder.LeatherArmorBuilder;
|
||||
import io.github.fisher2911.hmccosmetics.util.builder.ColorBuilder;
|
||||
import io.github.fisher2911.hmccosmetics.util.builder.SkullBuilder;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Color;
|
||||
import org.bukkit.Material;
|
||||
@@ -41,6 +43,7 @@ public class ItemSerializer implements TypeSerializer<GuiItem> {
|
||||
private static final String UNBREAKABLE = "unbreakable";
|
||||
private static final String GLOWING = "glowing";
|
||||
private static final String LORE = "lore";
|
||||
private static final String LOCKED_LORE = "locked-lore";
|
||||
private static final String MODEL_DATA = "model-data";
|
||||
private static final String ENCHANTS = "enchants";
|
||||
private static final String ITEM_FLAGS = "item-flags";
|
||||
@@ -54,6 +57,7 @@ public class ItemSerializer implements TypeSerializer<GuiItem> {
|
||||
private static final String TYPE = "type";
|
||||
private static final String OPEN_MENU = "open-menu";
|
||||
private static final String ID = "id";
|
||||
private static final String DYEABLE = "dyeable";
|
||||
|
||||
private ItemSerializer() {
|
||||
}
|
||||
@@ -74,6 +78,7 @@ public class ItemSerializer implements TypeSerializer<GuiItem> {
|
||||
final ConfigurationNode unbreakableNode = source.node(UNBREAKABLE);
|
||||
final ConfigurationNode glowingNode = source.node(GLOWING);
|
||||
final ConfigurationNode loreNode = source.node(LORE);
|
||||
final ConfigurationNode lockedLoreNode = source.node(LOCKED_LORE);
|
||||
final ConfigurationNode modelDataNode = source.node(MODEL_DATA);
|
||||
final ConfigurationNode enchantsNode = source.node(ENCHANTS);
|
||||
final ConfigurationNode itemFlagsNode = source.node(ITEM_FLAGS);
|
||||
@@ -87,17 +92,22 @@ public class ItemSerializer implements TypeSerializer<GuiItem> {
|
||||
final ConfigurationNode typeNode = source.node(TYPE);
|
||||
final ConfigurationNode openMenuNode = source.node(OPEN_MENU);
|
||||
final ConfigurationNode idNode = source.node(ID);
|
||||
final ConfigurationNode dyeableNode = source.node(DYEABLE);
|
||||
|
||||
|
||||
final Material material = Utils.stringToEnum(Utils.replaceIfNull(materialNode.getString(), ""),
|
||||
Material.class, Material.AIR);
|
||||
final int amount = amountNode.getInt();
|
||||
final String name = StringUtils.parseStringToString(Utils.replaceIfNull(nameNode.getString(), ""));
|
||||
final Component name = Adventure.MINI_MESSAGE.parse(
|
||||
Utils.replaceIfNull(nameNode.getString(), "")
|
||||
);
|
||||
|
||||
final boolean unbreakable = unbreakableNode.getBoolean();
|
||||
final boolean glowing = glowingNode.getBoolean();
|
||||
final List<String> lore = Utils.replaceIfNull(loreNode.getList(String.class), new ArrayList<String>()).
|
||||
stream().map(StringUtils::parseStringToString).collect(Collectors.toList());
|
||||
final List<String> lockedLore = Utils.replaceIfNull(lockedLoreNode.getList(String.class), new ArrayList<String>()).
|
||||
stream().map(StringUtils::parseStringToString).collect(Collectors.toList());
|
||||
final int modelData = modelDataNode.getInt();
|
||||
final Set<ItemFlag> itemFlags = Utils.replaceIfNull(itemFlagsNode.getList(String.class), new ArrayList<String>()).
|
||||
stream().map(flag -> {
|
||||
@@ -109,7 +119,17 @@ public class ItemSerializer implements TypeSerializer<GuiItem> {
|
||||
}).collect(Collectors.toSet());
|
||||
final String texture = textureNode.getString();
|
||||
final String owner = ownerNode.getString();
|
||||
final Color color = Color.fromBGR(redNode.getInt(), greenNode.getInt(), blueNode.getInt());
|
||||
|
||||
|
||||
final boolean dyeable = dyeableNode.getBoolean();
|
||||
|
||||
final Color color;
|
||||
|
||||
if (colorNode.virtual()) {
|
||||
color = null;
|
||||
} else {
|
||||
color = Color.fromBGR(redNode.getInt(), greenNode.getInt(), blueNode.getInt());
|
||||
}
|
||||
|
||||
final Map<Enchantment, Integer> enchantments =
|
||||
Utils.replaceIfNull(enchantsNode.getList(String.class),
|
||||
@@ -150,10 +170,10 @@ public class ItemSerializer implements TypeSerializer<GuiItem> {
|
||||
final OfflinePlayer player = Bukkit.getOfflinePlayer(owner);
|
||||
((SkullBuilder) itemBuilder).owner(player);
|
||||
}
|
||||
} else if (LeatherArmorBuilder.isLeatherArmor(material)) {
|
||||
itemBuilder = LeatherArmorBuilder.from(material);
|
||||
} else if (ColorBuilder.canBeColored(material)) {
|
||||
itemBuilder = ColorBuilder.from(material);
|
||||
if (color != null) {
|
||||
((LeatherArmorBuilder) itemBuilder).color(color);
|
||||
((ColorBuilder) itemBuilder).color(color);
|
||||
}
|
||||
} else {
|
||||
itemBuilder = ItemBuilder.from(material);
|
||||
@@ -182,8 +202,10 @@ public class ItemSerializer implements TypeSerializer<GuiItem> {
|
||||
return new ArmorItem(
|
||||
itemStack,
|
||||
Utils.replaceIfNull(idNode.getString(), ""),
|
||||
lockedLore,
|
||||
permission,
|
||||
cosmeticType);
|
||||
cosmeticType,
|
||||
dyeable);
|
||||
|
||||
} catch (final IllegalArgumentException exception) {
|
||||
final String openMenu = openMenuNode.getString(
|
||||
|
||||
@@ -2,15 +2,19 @@ package io.github.fisher2911.hmccosmetics.gui;
|
||||
|
||||
import dev.triumphteam.gui.components.GuiAction;
|
||||
import dev.triumphteam.gui.guis.GuiItem;
|
||||
import io.github.fisher2911.hmccosmetics.util.builder.ItemBuilder;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class ArmorItem extends GuiItem {
|
||||
|
||||
private final String id;
|
||||
private final List<String> lockedLore;
|
||||
private final GuiAction<InventoryClickEvent> action;
|
||||
private final String permission;
|
||||
private final Type type;
|
||||
@@ -20,10 +24,12 @@ public class ArmorItem extends GuiItem {
|
||||
@NotNull final ItemStack itemStack,
|
||||
final GuiAction<InventoryClickEvent> action,
|
||||
final String id,
|
||||
final List<String> lockedLore,
|
||||
final String permission,
|
||||
final Type type) {
|
||||
super(itemStack, action);
|
||||
this.id = id;
|
||||
this.lockedLore = lockedLore;
|
||||
this.action = action;
|
||||
this.permission = permission;
|
||||
this.type = type;
|
||||
@@ -32,10 +38,12 @@ public class ArmorItem extends GuiItem {
|
||||
public ArmorItem(
|
||||
@NotNull final ItemStack itemStack,
|
||||
final String id,
|
||||
final List<String> lockedLore,
|
||||
final String permission,
|
||||
final Type type) {
|
||||
super(itemStack);
|
||||
this.id = id;
|
||||
this.lockedLore = lockedLore;
|
||||
this.action = null;
|
||||
this.permission = permission;
|
||||
this.type = type;
|
||||
@@ -44,10 +52,12 @@ public class ArmorItem extends GuiItem {
|
||||
public ArmorItem(
|
||||
@NotNull final Material material,
|
||||
final String id,
|
||||
final List<String> lockedLore,
|
||||
final String permission,
|
||||
final Type type) {
|
||||
super(material);
|
||||
this.id = id;
|
||||
this.lockedLore = lockedLore;
|
||||
this.action = null;
|
||||
this.permission = permission;
|
||||
this.type = type;
|
||||
@@ -57,10 +67,12 @@ public class ArmorItem extends GuiItem {
|
||||
@NotNull final Material material,
|
||||
@Nullable final GuiAction<InventoryClickEvent> action,
|
||||
final String id,
|
||||
final List<String> lockedLore,
|
||||
final String permission,
|
||||
final Type type) {
|
||||
super(material, action);
|
||||
this.id = id;
|
||||
this.lockedLore = lockedLore;
|
||||
this.action = action;
|
||||
this.permission = permission;
|
||||
this.type = type;
|
||||
@@ -69,11 +81,14 @@ public class ArmorItem extends GuiItem {
|
||||
public ArmorItem(
|
||||
@NotNull final ItemStack itemStack,
|
||||
final GuiAction<InventoryClickEvent> action,
|
||||
final String id, final String permission,
|
||||
final String id,
|
||||
final List<String> lockedLore,
|
||||
final String permission,
|
||||
final Type type,
|
||||
final boolean dyeable) {
|
||||
super(itemStack, action);
|
||||
this.id = id;
|
||||
this.lockedLore = lockedLore;
|
||||
this.action = action;
|
||||
this.permission = permission;
|
||||
this.type = type;
|
||||
@@ -83,11 +98,13 @@ public class ArmorItem extends GuiItem {
|
||||
public ArmorItem(
|
||||
@NotNull final ItemStack itemStack,
|
||||
final String id,
|
||||
final List<String> lockedLore,
|
||||
final String permission,
|
||||
final Type type,
|
||||
final boolean dyeable) {
|
||||
super(itemStack);
|
||||
this.id = id;
|
||||
this.lockedLore = lockedLore;
|
||||
this.action = null;
|
||||
this.permission = permission;
|
||||
this.type = type;
|
||||
@@ -97,11 +114,13 @@ public class ArmorItem extends GuiItem {
|
||||
public ArmorItem(
|
||||
@NotNull final Material material,
|
||||
final String id,
|
||||
final List<String> lockedLore,
|
||||
final String permission,
|
||||
final Type type,
|
||||
final boolean dyeable) {
|
||||
super(material);
|
||||
this.id = id;
|
||||
this.lockedLore = lockedLore;
|
||||
this.action = null;
|
||||
this.permission = permission;
|
||||
this.type = type;
|
||||
@@ -112,11 +131,13 @@ public class ArmorItem extends GuiItem {
|
||||
@NotNull final Material material,
|
||||
@Nullable final GuiAction<InventoryClickEvent> action,
|
||||
final String id,
|
||||
final List<String> lockedLore,
|
||||
final String permission,
|
||||
final Type type,
|
||||
final boolean dyeable) {
|
||||
super(material, action);
|
||||
this.id = id;
|
||||
this.lockedLore = lockedLore;
|
||||
this.action = action;
|
||||
this.permission = permission;
|
||||
this.type = type;
|
||||
@@ -127,6 +148,10 @@ public class ArmorItem extends GuiItem {
|
||||
return id;
|
||||
}
|
||||
|
||||
public List<String> getLockedLore() {
|
||||
return lockedLore;
|
||||
}
|
||||
|
||||
public GuiAction<InventoryClickEvent> getAction() {
|
||||
return this.action;
|
||||
}
|
||||
@@ -143,6 +168,16 @@ public class ArmorItem extends GuiItem {
|
||||
return dyeable;
|
||||
}
|
||||
|
||||
public ItemStack getItemStack(final boolean allowed) {
|
||||
if (allowed) {
|
||||
return this.getItemStack();
|
||||
}
|
||||
|
||||
return ItemBuilder.from(this.getItemStack()).
|
||||
lore(lockedLore).
|
||||
build();
|
||||
}
|
||||
|
||||
public enum Type {
|
||||
|
||||
HAT,
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
package io.github.fisher2911.hmccosmetics.gui;
|
||||
|
||||
import dev.triumphteam.gui.components.GuiAction;
|
||||
import dev.triumphteam.gui.guis.GuiItem;
|
||||
import org.bukkit.Color;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
public class ColorItem extends GuiItem {
|
||||
|
||||
private final Color color;
|
||||
|
||||
public ColorItem(final @NotNull ItemStack itemStack, final GuiAction<InventoryClickEvent> action, final Color color) {
|
||||
super(itemStack, action);
|
||||
this.color = color;
|
||||
}
|
||||
|
||||
public ColorItem(final @NotNull ItemStack itemStack, final Color color) {
|
||||
super(itemStack);
|
||||
this.color = color;
|
||||
}
|
||||
|
||||
public ColorItem(final @NotNull Material material, final Color color) {
|
||||
super(material);
|
||||
this.color = color;
|
||||
}
|
||||
|
||||
public ColorItem(final @NotNull Material material, final @Nullable GuiAction<InventoryClickEvent> action, final Color color) {
|
||||
super(material, action);
|
||||
this.color = color;
|
||||
}
|
||||
|
||||
public Color getColor() {
|
||||
return color;
|
||||
}
|
||||
}
|
||||
@@ -9,7 +9,6 @@ import io.github.fisher2911.hmccosmetics.message.MessageHandler;
|
||||
import io.github.fisher2911.hmccosmetics.message.Messages;
|
||||
import io.github.fisher2911.hmccosmetics.message.Placeholder;
|
||||
import io.github.fisher2911.hmccosmetics.user.User;
|
||||
import io.github.fisher2911.hmccosmetics.user.UserManager;
|
||||
import io.github.fisher2911.hmccosmetics.util.builder.ItemBuilder;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.HumanEntity;
|
||||
@@ -22,12 +21,12 @@ import java.util.Optional;
|
||||
|
||||
public class CosmeticGui {
|
||||
|
||||
private final HMCCosmetics plugin;
|
||||
private final MessageHandler messageHandler;
|
||||
private final String title;
|
||||
private final int rows;
|
||||
private final Map<Integer, GuiItem> guiItemMap;
|
||||
private Gui gui;
|
||||
protected final HMCCosmetics plugin;
|
||||
protected final MessageHandler messageHandler;
|
||||
protected final String title;
|
||||
protected final int rows;
|
||||
protected final Map<Integer, GuiItem> guiItemMap;
|
||||
protected Gui gui;
|
||||
|
||||
public CosmeticGui(
|
||||
final HMCCosmetics plugin,
|
||||
|
||||
@@ -2,9 +2,12 @@ package io.github.fisher2911.hmccosmetics.gui;
|
||||
|
||||
import dev.triumphteam.gui.guis.GuiItem;
|
||||
import io.github.fisher2911.hmccosmetics.HMCCosmetics;
|
||||
import io.github.fisher2911.hmccosmetics.config.DyeGuiSerializer;
|
||||
import io.github.fisher2911.hmccosmetics.config.GuiSerializer;
|
||||
import io.github.fisher2911.hmccosmetics.config.ItemSerializer;
|
||||
import io.github.fisher2911.hmccosmetics.user.User;
|
||||
import org.bukkit.entity.HumanEntity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.spongepowered.configurate.ConfigurateException;
|
||||
import org.spongepowered.configurate.ConfigurationNode;
|
||||
import org.spongepowered.configurate.yaml.YamlConfigurationLoader;
|
||||
@@ -17,6 +20,7 @@ import java.util.Map;
|
||||
public class CosmeticsMenu {
|
||||
|
||||
public static final String MAIN_MENU = "main";
|
||||
public static final String DYE_MENU = "dye-menu";
|
||||
|
||||
private final HMCCosmetics plugin;
|
||||
|
||||
@@ -42,6 +46,27 @@ public class CosmeticsMenu {
|
||||
this.load();
|
||||
}
|
||||
|
||||
public void openDyeSelectorGui(
|
||||
final User user,
|
||||
final ArmorItem armorItem) {
|
||||
|
||||
final Player player = user.getPlayer();
|
||||
|
||||
if (player == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
final CosmeticGui gui = this.guiMap.get(DYE_MENU);
|
||||
|
||||
if (gui instanceof final DyeSelectorGui dyeSelectorGui) {
|
||||
player.sendMessage("Is Dye selector");
|
||||
dyeSelectorGui.getGui(user, armorItem).open(player);
|
||||
} else {
|
||||
player.sendMessage("Not dye selector");
|
||||
player.sendMessage(gui.getClass().toString());
|
||||
}
|
||||
}
|
||||
|
||||
public void load() {
|
||||
this.guiMap.clear();
|
||||
final File file = Path.of(this.plugin.getDataFolder().getPath(),
|
||||
@@ -49,9 +74,18 @@ public class CosmeticsMenu {
|
||||
|
||||
if (!Path.of(this.plugin.getDataFolder().getPath(),
|
||||
"menus",
|
||||
"main").toFile().exists()) {
|
||||
MAIN_MENU).toFile().exists()) {
|
||||
this.plugin.saveResource(
|
||||
new File("menus", "main.yml").getPath(),
|
||||
new File("menus", MAIN_MENU).getPath(),
|
||||
false
|
||||
);
|
||||
}
|
||||
|
||||
if (!Path.of(this.plugin.getDataFolder().getPath(),
|
||||
"menus",
|
||||
DYE_MENU).toFile().exists()) {
|
||||
this.plugin.saveResource(
|
||||
new File("menus", DYE_MENU).getPath(),
|
||||
false
|
||||
);
|
||||
}
|
||||
@@ -79,12 +113,20 @@ public class CosmeticsMenu {
|
||||
opts.serializers(build -> {
|
||||
build.register(GuiItem.class, ItemSerializer.INSTANCE);
|
||||
build.register(CosmeticGui.class, GuiSerializer.INSTANCE);
|
||||
build.register(DyeSelectorGui.class, DyeGuiSerializer.INSTANCE);
|
||||
}))
|
||||
.build();
|
||||
|
||||
try {
|
||||
final ConfigurationNode source = loader.load();
|
||||
|
||||
if (id.equals(DYE_MENU)) {
|
||||
this.guiMap.put(id, DyeGuiSerializer.INSTANCE.deserialize(DyeSelectorGui.class,
|
||||
source));
|
||||
this.plugin.getLogger().severe("Loaded dye gui: " + id);
|
||||
continue;
|
||||
}
|
||||
|
||||
this.guiMap.put(id, source.get(CosmeticGui.class));
|
||||
this.plugin.getLogger().severe("Loaded gui: " + id);
|
||||
} catch (final ConfigurateException exception) {
|
||||
|
||||
@@ -2,54 +2,43 @@ package io.github.fisher2911.hmccosmetics.gui;
|
||||
|
||||
import dev.triumphteam.gui.builder.item.ItemBuilder;
|
||||
import dev.triumphteam.gui.guis.Gui;
|
||||
import io.github.fisher2911.hmccosmetics.config.ItemSerializer;
|
||||
import dev.triumphteam.gui.guis.GuiItem;
|
||||
import io.github.fisher2911.hmccosmetics.HMCCosmetics;
|
||||
import io.github.fisher2911.hmccosmetics.inventory.PlayerArmor;
|
||||
import io.github.fisher2911.hmccosmetics.user.User;
|
||||
import io.github.fisher2911.hmccosmetics.util.builder.LeatherArmorBuilder;
|
||||
import io.github.fisher2911.hmccosmetics.util.builder.ColorBuilder;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import org.bukkit.Color;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.LeatherArmorMeta;
|
||||
import org.checkerframework.checker.units.qual.A;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class DyeSelectorGui {
|
||||
|
||||
private final String title;
|
||||
private final int rows;
|
||||
private final Map<Integer, Color> itemColors;
|
||||
private final ArmorItem armorItem;
|
||||
public class DyeSelectorGui extends CosmeticGui{
|
||||
|
||||
public DyeSelectorGui(
|
||||
final HMCCosmetics plugin,
|
||||
final String title,
|
||||
final int rows,
|
||||
final Map<Integer, Color> itemColors,
|
||||
final ArmorItem armorItem) {
|
||||
this.title = title;
|
||||
this.rows = rows;
|
||||
this.itemColors = itemColors;
|
||||
this.armorItem = armorItem;
|
||||
final Map<Integer, GuiItem> guiItemMap) {
|
||||
super(plugin, title, rows, guiItemMap);
|
||||
}
|
||||
|
||||
public Gui getGui(final User user) {
|
||||
public Gui getGui(final User user, final ArmorItem armorItem) {
|
||||
final Gui gui = Gui.gui().
|
||||
title(Component.text(this.title)).
|
||||
rows(rows).
|
||||
create();
|
||||
|
||||
for (final var entry : itemColors.entrySet()) {
|
||||
gui.setItem(entry.getKey(), ItemBuilder.from(Material.BLACK_DYE).
|
||||
name(Component.text(
|
||||
String.valueOf(entry.getValue().asRGB()))).asGuiItem());
|
||||
for (final var entry : this.guiItemMap.entrySet()) {
|
||||
gui.setItem(entry.getKey(), entry.getValue());
|
||||
}
|
||||
|
||||
gui.setDefaultClickAction(event -> {
|
||||
event.setCancelled(true);
|
||||
|
||||
final ArmorItem.Type type = this.armorItem.getType();
|
||||
final ArmorItem.Type type = armorItem.getType();
|
||||
|
||||
final PlayerArmor playerArmor = user.getPlayerArmor();
|
||||
|
||||
@@ -77,55 +66,45 @@ public class DyeSelectorGui {
|
||||
};
|
||||
|
||||
if (itemStack == null) {
|
||||
event.getWhoClicked().sendMessage("ItemStack null");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!(itemStack.getItemMeta() instanceof final LeatherArmorMeta itemMeta)) {
|
||||
if (!armorItem.isDyeable()) {
|
||||
event.getWhoClicked().sendMessage("Not dyeable");
|
||||
return;
|
||||
}
|
||||
|
||||
final LeatherArmorBuilder leatherArmorBuilder =
|
||||
LeatherArmorBuilder.from(itemStack);
|
||||
final ColorBuilder colorBuilder =
|
||||
ColorBuilder.from(itemStack);
|
||||
|
||||
final Color color = this.itemColors.get(event.getSlot());
|
||||
final GuiItem guiItem = this.guiItemMap.get(event.getSlot());
|
||||
|
||||
if (color == null) {
|
||||
if (!(guiItem instanceof final ColorItem colorItem)) {
|
||||
event.getWhoClicked().sendMessage("Not color item");
|
||||
return;
|
||||
}
|
||||
|
||||
leatherArmorBuilder.color(color);
|
||||
final Color color = colorItem.getColor();
|
||||
|
||||
final ArmorItem armorItem = new ArmorItem(
|
||||
leatherArmorBuilder.build(),
|
||||
this.armorItem.getAction(),
|
||||
this.armorItem.getId(),
|
||||
this.armorItem.getPermission(),
|
||||
this.armorItem.getType(),
|
||||
this.armorItem.isDyeable()
|
||||
colorBuilder.color(color);
|
||||
|
||||
final ArmorItem newArmorItem = new ArmorItem(
|
||||
colorBuilder.build(),
|
||||
armorItem.getAction(),
|
||||
armorItem.getId(),
|
||||
armorItem.getLockedLore(),
|
||||
armorItem.getPermission(),
|
||||
armorItem.getType(),
|
||||
armorItem.isDyeable()
|
||||
);
|
||||
|
||||
switch (type) {
|
||||
case HAT -> user.setHat(armorItem);
|
||||
case BACKPACK -> user.setBackpack(armorItem);
|
||||
case HAT -> user.setHat(newArmorItem);
|
||||
case BACKPACK -> user.setBackpack(newArmorItem);
|
||||
}
|
||||
});
|
||||
|
||||
return gui;
|
||||
}
|
||||
|
||||
public String getTitle() {
|
||||
return title;
|
||||
}
|
||||
|
||||
public int getRows() {
|
||||
return rows;
|
||||
}
|
||||
|
||||
public Map<Integer, Color> getItemColors() {
|
||||
return itemColors;
|
||||
}
|
||||
|
||||
public ArmorItem getArmorItem() {
|
||||
return armorItem;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,8 @@ import io.github.fisher2911.hmccosmetics.gui.ArmorItem;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class PlayerArmor {
|
||||
|
||||
private ArmorItem hat;
|
||||
@@ -19,12 +21,14 @@ public class PlayerArmor {
|
||||
new ArmorItem(
|
||||
new ItemStack(Material.AIR),
|
||||
"",
|
||||
new ArrayList<>(),
|
||||
"",
|
||||
ArmorItem.Type.HAT
|
||||
),
|
||||
new ArmorItem(
|
||||
new ItemStack(Material.AIR),
|
||||
"",
|
||||
new ArrayList<>(),
|
||||
"",
|
||||
ArmorItem.Type.BACKPACK
|
||||
));
|
||||
|
||||
@@ -12,6 +12,7 @@ import org.bukkit.inventory.EntityEquipment;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.UUID;
|
||||
|
||||
public class User {
|
||||
@@ -53,6 +54,7 @@ public class User {
|
||||
this.setBackpack(new ArmorItem(
|
||||
new ItemStack(Material.AIR),
|
||||
"",
|
||||
new ArrayList<>(),
|
||||
"",
|
||||
ArmorItem.Type.BACKPACK
|
||||
));
|
||||
@@ -90,6 +92,7 @@ public class User {
|
||||
this.setHat(new ArmorItem(
|
||||
new ItemStack(Material.AIR),
|
||||
"",
|
||||
new ArrayList<>(),
|
||||
"",
|
||||
ArmorItem.Type.HAT
|
||||
));
|
||||
|
||||
@@ -0,0 +1,88 @@
|
||||
package io.github.fisher2911.hmccosmetics.util.builder;
|
||||
|
||||
import org.bukkit.Color;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
import org.bukkit.inventory.meta.LeatherArmorMeta;
|
||||
import org.bukkit.inventory.meta.PotionMeta;
|
||||
|
||||
import java.util.EnumSet;
|
||||
import java.util.Set;
|
||||
|
||||
public class ColorBuilder extends ItemBuilder{
|
||||
|
||||
/**
|
||||
*
|
||||
* @param material ItemStack material
|
||||
*/
|
||||
|
||||
ColorBuilder(final Material material) {
|
||||
super(material);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param itemStack ItemStack
|
||||
*/
|
||||
|
||||
ColorBuilder(final ItemStack itemStack) {
|
||||
super(itemStack);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param material ItemStack material
|
||||
* @return this
|
||||
* @throws IllegalArgumentException thrown if itemStack's type can not change color
|
||||
*/
|
||||
|
||||
public static ColorBuilder from(final Material material) throws IllegalArgumentException {
|
||||
if (!canBeColored(material)) {
|
||||
throw new IllegalArgumentException(material.name() + " is not leather armor!");
|
||||
}
|
||||
return new ColorBuilder(material);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param itemStack ItemStack
|
||||
* @return this
|
||||
* @throws IllegalArgumentException thrown if itemStack's type can not change color
|
||||
*/
|
||||
|
||||
public static ColorBuilder from(final ItemStack itemStack) throws IllegalArgumentException {
|
||||
final Material material = itemStack.getType();
|
||||
if (!canBeColored(itemStack)) {
|
||||
throw new IllegalArgumentException(material.name() + " is not leather armor!");
|
||||
}
|
||||
return new ColorBuilder(itemStack);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param color armor color
|
||||
* @return this
|
||||
*/
|
||||
|
||||
public ColorBuilder color(final Color color) {
|
||||
if (this.itemMeta instanceof final PotionMeta meta) {
|
||||
meta.setColor(color);
|
||||
}
|
||||
if (this.itemMeta instanceof final LeatherArmorMeta meta) {
|
||||
meta.setColor(color);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
public static boolean canBeColored(final Material material) {
|
||||
return canBeColored(new ItemStack(material));
|
||||
}
|
||||
|
||||
public static boolean canBeColored(final ItemStack itemStack) {
|
||||
final ItemMeta itemMeta = itemStack.getItemMeta();
|
||||
|
||||
return (itemMeta instanceof LeatherArmorMeta ||
|
||||
itemMeta instanceof PotionMeta);
|
||||
}
|
||||
}
|
||||
@@ -2,6 +2,7 @@ package io.github.fisher2911.hmccosmetics.util.builder;
|
||||
|
||||
import io.github.fisher2911.hmccosmetics.message.Adventure;
|
||||
import io.github.fisher2911.hmccosmetics.util.StringUtils;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.enchantments.Enchantment;
|
||||
@@ -76,6 +77,11 @@ public class ItemBuilder {
|
||||
return this;
|
||||
}
|
||||
|
||||
public ItemBuilder name(final Component name) {
|
||||
this.itemMeta.displayName(name);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets placeholders to the item's name
|
||||
*
|
||||
|
||||
@@ -1,86 +0,0 @@
|
||||
package io.github.fisher2911.hmccosmetics.util.builder;
|
||||
|
||||
import org.bukkit.Color;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.LeatherArmorMeta;
|
||||
|
||||
import java.util.EnumSet;
|
||||
import java.util.Set;
|
||||
|
||||
public class LeatherArmorBuilder extends ItemBuilder{
|
||||
|
||||
private static final Set<Material> VALID_ARMOR = EnumSet.of(Material.LEATHER_BOOTS,
|
||||
Material.LEATHER_LEGGINGS, Material.LEATHER_CHESTPLATE, Material.LEATHER_HELMET);
|
||||
|
||||
/**
|
||||
*
|
||||
* @param material ItemStack material
|
||||
*/
|
||||
|
||||
LeatherArmorBuilder(final Material material) {
|
||||
super(material);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param itemStack ItemStack
|
||||
*/
|
||||
|
||||
LeatherArmorBuilder(final ItemStack itemStack) {
|
||||
super(itemStack);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param material ItemStack material
|
||||
* @return this
|
||||
* @throws IllegalArgumentException thrown if material is not leather armor
|
||||
*/
|
||||
|
||||
public static LeatherArmorBuilder from(final Material material) throws IllegalArgumentException {
|
||||
if (!VALID_ARMOR.contains(material)) {
|
||||
throw new IllegalArgumentException(material.name() + " is not leather armor!");
|
||||
}
|
||||
return new LeatherArmorBuilder(material);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param itemStack ItemStack
|
||||
* @return this
|
||||
* @throws IllegalArgumentException thrown if itemStack's type is not leather armor
|
||||
*/
|
||||
|
||||
public static LeatherArmorBuilder from(final ItemStack itemStack) throws IllegalArgumentException {
|
||||
final Material material = itemStack.getType();
|
||||
if (!VALID_ARMOR.contains(material)) {
|
||||
throw new IllegalArgumentException(material.name() + " is not leather armor!");
|
||||
}
|
||||
return new LeatherArmorBuilder(itemStack);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param color armor color
|
||||
* @return this
|
||||
*/
|
||||
|
||||
public LeatherArmorBuilder color(final Color color) {
|
||||
if (itemMeta instanceof final LeatherArmorMeta meta) {
|
||||
meta.setColor(color);
|
||||
this.itemMeta = meta;
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param material checked material
|
||||
* @return true if is leather armor, else false
|
||||
*/
|
||||
|
||||
public static boolean isLeatherArmor(final Material material) {
|
||||
return VALID_ARMOR.contains(material);
|
||||
}
|
||||
}
|
||||
17
src/main/resources/menus/dye-menu.yml
Normal file
17
src/main/resources/menus/dye-menu.yml
Normal file
@@ -0,0 +1,17 @@
|
||||
title: Set Color
|
||||
rows: 3
|
||||
items:
|
||||
10:
|
||||
material: BLUE_STAINED_GLASS
|
||||
name: Set to blue
|
||||
set-color:
|
||||
red: 55
|
||||
green: 49
|
||||
blue: 181
|
||||
11:
|
||||
material: RED_STAINED_GLASS
|
||||
name: Set to red
|
||||
set-color:
|
||||
red: 190
|
||||
green: 20
|
||||
blue: 20
|
||||
@@ -8,6 +8,8 @@ items:
|
||||
- ""
|
||||
- "Enabled: %enabled%"
|
||||
- "Allowed: %allowed%"
|
||||
locked-lore:
|
||||
- "Not allowed"
|
||||
amount: 1
|
||||
type: BACKPACK
|
||||
permission: ""
|
||||
@@ -19,6 +21,8 @@ items:
|
||||
- ""
|
||||
- "Enabled: %enabled%"
|
||||
- "Allowed: %allowed%"
|
||||
locked-lore:
|
||||
- "Not allowed"
|
||||
amount: 1
|
||||
type: HAT
|
||||
permission: ""
|
||||
@@ -30,6 +34,8 @@ items:
|
||||
- ""
|
||||
- "Enabled: %enabled%"
|
||||
- "Allowed: %allowed%"
|
||||
locked-lore:
|
||||
- "Not allowed"
|
||||
amount: 1
|
||||
type: BACKPACK
|
||||
permission: ""
|
||||
@@ -41,6 +47,8 @@ items:
|
||||
- ""
|
||||
- "Enabled: %enabled%"
|
||||
- "Allowed: %allowed%"
|
||||
locked-lore:
|
||||
- "Not allowed"
|
||||
amount: 1
|
||||
type: HAT
|
||||
permission: ""
|
||||
@@ -52,10 +60,13 @@ items:
|
||||
- ""
|
||||
- "Enabled: %enabled%"
|
||||
- "Allowed: %allowed%"
|
||||
locked-lore:
|
||||
- "Not allowed"
|
||||
amount: 1
|
||||
type: BACKPACK
|
||||
permission: ""
|
||||
id: leather_backpack
|
||||
dyeable: true
|
||||
15:
|
||||
material: LEATHER_HELMET
|
||||
name: "<blue>Hat "
|
||||
@@ -63,6 +74,8 @@ items:
|
||||
- ""
|
||||
- "Enabled: %enabled%"
|
||||
- "Allowed: %allowed%"
|
||||
locked-lore:
|
||||
- "Not allowed"
|
||||
amount: 1
|
||||
type: HAT
|
||||
color:
|
||||
@@ -71,3 +84,4 @@ items:
|
||||
green: 230
|
||||
permission: ""
|
||||
id: leather_hat
|
||||
dyeable: true
|
||||
|
||||
Reference in New Issue
Block a user