diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/HMCCosmetics.java b/src/main/java/io/github/fisher2911/hmccosmetics/HMCCosmetics.java index 33f8a28c..98c273c6 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/HMCCosmetics.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/HMCCosmetics.java @@ -4,6 +4,7 @@ import com.comphenix.protocol.ProtocolLibrary; import com.comphenix.protocol.ProtocolManager; import io.github.fisher2911.hmccosmetics.command.CosmeticsCommand; +import io.github.fisher2911.hmccosmetics.cosmetic.CosmeticManager; import io.github.fisher2911.hmccosmetics.gui.ArmorItem; import io.github.fisher2911.hmccosmetics.gui.CosmeticsMenu; import io.github.fisher2911.hmccosmetics.listener.ClickListener; @@ -18,6 +19,7 @@ import org.bstats.bukkit.Metrics; import org.bukkit.plugin.java.JavaPlugin; import java.util.Arrays; +import java.util.HashMap; import java.util.List; import java.util.stream.Collectors; @@ -25,6 +27,7 @@ public class HMCCosmetics extends JavaPlugin { private ProtocolManager protocolManager; private UserManager userManager; + private CosmeticManager cosmeticManager; private MessageHandler messageHandler; private CosmeticsMenu cosmeticsMenu; private CommandManager commandManager; @@ -37,6 +40,7 @@ public class HMCCosmetics extends JavaPlugin { protocolManager = ProtocolLibrary.getProtocolManager(); this.messageHandler = new MessageHandler(this); this.userManager = new UserManager(this); + this.cosmeticManager = new CosmeticManager(new HashMap<>()); this.cosmeticsMenu = new CosmeticsMenu(this); this.messageHandler.load(); this.cosmeticsMenu.load(); @@ -80,6 +84,9 @@ public class HMCCosmetics extends JavaPlugin { map(ArmorItem.Type::toString). collect(Collectors.toList()) ); + this.commandManager.getCompletionHandler().register("#ids", + resolver -> + this.cosmeticManager.getAll().stream().map(ArmorItem::getId).collect(Collectors.toList())); this.commandManager.register(new CosmeticsCommand(this)); } @@ -91,6 +98,10 @@ public class HMCCosmetics extends JavaPlugin { return userManager; } + public CosmeticManager getCosmeticManager() { + return cosmeticManager; + } + public CosmeticsMenu getCosmeticsMenu() { return cosmeticsMenu; } diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/command/CosmeticsCommand.java b/src/main/java/io/github/fisher2911/hmccosmetics/command/CosmeticsCommand.java index 8bdd0fe3..527beb62 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/command/CosmeticsCommand.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/command/CosmeticsCommand.java @@ -7,6 +7,7 @@ import io.github.fisher2911.hmccosmetics.gui.DyeSelectorGui; import io.github.fisher2911.hmccosmetics.message.Message; 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 me.mattstudios.mf.annotations.Command; @@ -94,13 +95,66 @@ public class CosmeticsCommand extends CommandBase { public void helpCommand(final CommandSender sender) { Bukkit.getScheduler().runTaskAsynchronously( this.plugin, - () -> { - this.messageHandler.sendMessage( - sender, - Messages.HELP_COMMAND - ); - } + () -> this.messageHandler.sendMessage( + sender, + Messages.HELP_COMMAND + ) ); } + @SubCommand("add") + @Permission(io.github.fisher2911.hmccosmetics.message.Permission.SET_COSMETIC_COMMAND) + public void setCommand(final CommandSender sender, final Player player, @Completion("#ids") final String id) { + final Optional userOptional = this.userManager.get(player.getUniqueId()); + + if (userOptional.isEmpty()) { + this.messageHandler.sendMessage( + sender, + Messages.INVALID_USER + ); + return; + } + + final User user = userOptional.get(); + + final ArmorItem armorItem = this.plugin.getCosmeticManager().getArmorItem(id); + + if (armorItem == null) { + this.messageHandler.sendMessage( + sender, + Messages.ITEM_NOT_FOUND + ); + return; + } + + switch (armorItem.getType()) { + case BACKPACK -> { + user.setBackpack(armorItem); + this.messageHandler.sendMessage( + player, + Messages.SET_BACKPACK + ); + this.messageHandler.sendMessage( + sender, + Messages.SET_OTHER_BACKPACK, + Map.of(Placeholder.PLAYER, player.getName(), + Placeholder.ITEM, id) + ); + } + case HAT -> { + user.setHat(armorItem, this.userManager); + this.messageHandler.sendMessage( + player, + Messages.SET_HAT + ); + this.messageHandler.sendMessage( + sender, + Messages.SET_OTHER_HAT, + Map.of(Placeholder.PLAYER, player.getName(), + Placeholder.ITEM, id) + ); + } + } + } + } diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/cosmetic/CosmeticManager.java b/src/main/java/io/github/fisher2911/hmccosmetics/cosmetic/CosmeticManager.java new file mode 100644 index 00000000..399fe652 --- /dev/null +++ b/src/main/java/io/github/fisher2911/hmccosmetics/cosmetic/CosmeticManager.java @@ -0,0 +1,30 @@ +package io.github.fisher2911.hmccosmetics.cosmetic; + +import io.github.fisher2911.hmccosmetics.gui.ArmorItem; +import org.jetbrains.annotations.Nullable; + +import java.util.Collection; +import java.util.Map; +import java.util.Set; + +public class CosmeticManager { + + private final Map armorItemMap; + + public CosmeticManager(final Map armorItemMap) { + this.armorItemMap = armorItemMap; + } + + @Nullable + public ArmorItem getArmorItem(final String id) { + return this.armorItemMap.get(id); + } + + public void addArmorItem(final ArmorItem armorItem) { + this.armorItemMap.put(armorItem.getId(), armorItem); + } + + public Collection getAll() { + return this.armorItemMap.values(); + } +} diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/gui/CosmeticsMenu.java b/src/main/java/io/github/fisher2911/hmccosmetics/gui/CosmeticsMenu.java index 7b5ffeef..648326ea 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/gui/CosmeticsMenu.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/gui/CosmeticsMenu.java @@ -5,6 +5,7 @@ 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.cosmetic.CosmeticManager; import io.github.fisher2911.hmccosmetics.user.User; import org.bukkit.entity.HumanEntity; import org.bukkit.entity.Player; @@ -23,11 +24,13 @@ public class CosmeticsMenu { public static final String DYE_MENU = "dye-menu"; private final HMCCosmetics plugin; + private final CosmeticManager cosmeticManager; private final Map guiMap = new HashMap<>(); public CosmeticsMenu(final HMCCosmetics plugin) { this.plugin = plugin; + this.cosmeticManager = this.plugin.getCosmeticManager(); } public void openMenu(final String id, final HumanEntity humanEntity) { @@ -124,6 +127,17 @@ public class CosmeticsMenu { this.plugin.getLogger().info("Loaded dye gui: " + id); continue; } + + final CosmeticGui gui = source.get(CosmeticGui.class); + + if (gui == null) continue; + + for (final GuiItem guiItem : gui.guiItemMap.values()) { + if (guiItem instanceof final ArmorItem item) { + this.cosmeticManager.addArmorItem(item); + } + } + this.guiMap.put(id, source.get(CosmeticGui.class)); this.plugin.getLogger().info("Loaded gui: " + id); } catch (final ConfigurateException exception) { diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/message/Messages.java b/src/main/java/io/github/fisher2911/hmccosmetics/message/Messages.java index b023bee2..951f626d 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/message/Messages.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/message/Messages.java @@ -1,5 +1,7 @@ package io.github.fisher2911.hmccosmetics.message; +import org.bukkit.ChatColor; + public class Messages { public static final Message NO_PERMISSION = @@ -20,6 +22,10 @@ public class Messages { new Message("reloaded", "Config reloaded"); public static final Message INVALID_TYPE = new Message("invalid-type", "Invalid type"); + public static final Message INVALID_USER = + new Message("invalid-user", ChatColor.RED + "That user's data cannot be found!"); + public static final Message ITEM_NOT_FOUND = + new Message("item-not-found", ChatColor.RED + "That item could not be found!"); public static final Message HELP_COMMAND = new Message("help-command", "<#6D9DC5> HMCCosmetics - Help<#6D9DC5> \n" + "\n" + @@ -32,4 +38,13 @@ public class Messages { "\n" + "\n" + " "); + + public static final Message SET_OTHER_BACKPACK = new Message( + "set-other-backpack", ChatColor.GREEN + "You have set the backpack of " + + Placeholder.PLAYER + " to " + Placeholder.TYPE + "." + ); + public static final Message SET_OTHER_HAT = new Message( + "set-other-backpack", ChatColor.GREEN + "You have set the helment of " + + Placeholder.PLAYER + " to " + Placeholder.TYPE + "." + ); } diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/message/Permission.java b/src/main/java/io/github/fisher2911/hmccosmetics/message/Permission.java index a033443b..17cfd0ff 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/message/Permission.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/message/Permission.java @@ -6,5 +6,6 @@ public class Permission { public static final String DYE_COMMAND = "hmccosmetics.cmd.dye"; public static final String RELOAD_COMMAND = "hmccosmetics.cmd.reload"; public static final String HELP_COMMAND = "hmccosmetics.cmd.help"; + public static final String SET_COSMETIC_COMMAND = "hmccosmetics.cmd.set"; } diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/message/Placeholder.java b/src/main/java/io/github/fisher2911/hmccosmetics/message/Placeholder.java index b314a18b..3ab1523c 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/message/Placeholder.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/message/Placeholder.java @@ -7,6 +7,7 @@ public class Placeholder { public static final String ITEM = "%item%"; public static final String FILE = "%file%"; + public static final String PLAYER = "%player%"; public static final String ENABLED = "%enabled%"; public static final String ALLOWED = "%allowed%"; } diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 5b475fec..5be5dafd 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -15,4 +15,7 @@ permissions: description: Permission to dye armor hmccosmetics.cmd.reload: default: op - description: Permission to use the reload command \ No newline at end of file + description: Permission to use the reload command + hmccosmetics.cmd.set: + default: op + description: Permission to set other users' cosmetics \ No newline at end of file