From 96cf3dde0ed037e59f7845bbdc0d92bc01059bb4 Mon Sep 17 00:00:00 2001 From: math0898 <25396616+math0898@users.noreply.github.com> Date: Fri, 28 Apr 2023 20:55:40 -0500 Subject: [PATCH 1/9] Some Forge Optimizations and Bug Fixes - Fixed a NullPointer bug that arose when closing the forge without any items in slots. - Cleaned and streamlined ForgeEventListener (GodEventListener). - Removed ForgeManager. - Renamed files and folders to more fitting ones. --- .../forge/ForgeEventListener.java | 78 +++++++ .../Forge.java => forge/ForgeMainMenu.java} | 8 +- .../io/github/math0898/rpgframework/main.java | 4 +- .../systems/GodEventListener.java | 59 ------ .../rpg/framework/menus/ForgeManager.java | 194 ------------------ 5 files changed, 84 insertions(+), 259 deletions(-) create mode 100644 src/main/java/io/github/math0898/rpgframework/forge/ForgeEventListener.java rename src/main/java/io/github/math0898/rpgframework/{systems/Forge.java => forge/ForgeMainMenu.java} (97%) delete mode 100644 src/main/java/io/github/math0898/rpgframework/systems/GodEventListener.java delete mode 100644 src/main/java/sugaku/rpg/framework/menus/ForgeManager.java diff --git a/src/main/java/io/github/math0898/rpgframework/forge/ForgeEventListener.java b/src/main/java/io/github/math0898/rpgframework/forge/ForgeEventListener.java new file mode 100644 index 0000000..79d2a0a --- /dev/null +++ b/src/main/java/io/github/math0898/rpgframework/forge/ForgeEventListener.java @@ -0,0 +1,78 @@ +package io.github.math0898.rpgframework.forge; + +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; +import org.bukkit.event.inventory.*; +import org.bukkit.inventory.Inventory; +import org.bukkit.event.player.PlayerInteractEvent; + +/** + * Listens to and passes on events relating to the Forge system overall. + * + * @author Sugaku + */ +public class ForgeEventListener implements Listener { + + /** + * Called whenever an inventory is clicked. We quickly check whether this is a forge or not to reduce lag. Then if + * relevant we pass the event onto the Forge. + * + * @param event The inventory click event to consider. + */ + @EventHandler + public void invClick (InventoryClickEvent event) { + + if (!isForgeMenu(event)) return; + + Inventory clicked = event.getClickedInventory(); + if (clicked == null) return; + + ForgeMainMenu.forgeClicked(event); + } + + /** + * Called when a player interacts with anything in the world, item, block etc. We filter immediately to block clicks + * to hopefully reduce lag. When the multi-block matches a forge we open the forge menu. + * + * @param event The player interact event to consider. + */ + @EventHandler + public void onPlayerInteract (PlayerInteractEvent event) { + + if (event.getAction() != Action.RIGHT_CLICK_BLOCK) return; + + Block clicked = event.getClickedBlock(); + if (clicked == null) return; + if (clicked.getType() != Material.ANVIL) return; + + Block base = clicked.getWorld().getBlockAt(clicked.getLocation().add(0, -1, 0)); + if (base.getType() != Material.NETHERITE_BLOCK) return; + + event.setCancelled(true); + ForgeMainMenu.forgeMenu(event.getPlayer()); + } + + + /** + * Called when an inventory is closed. Used by the forge to return items to players if any remain in the inventory. + * + * @param event The inventory close event that may involve the forge. + */ + @EventHandler + public void onInventoryClose (InventoryCloseEvent event) { + if (isForgeMenu(event)) ForgeMainMenu.forgeClose(event); + } + + /** + * Checks whether the inventory event involves an instance of the Forge or not. + * + * @param event An inventory event that may involve the forge menu or not. + * @return True if the given inventory event involves the forge. + */ + public boolean isForgeMenu (InventoryEvent event) { + return event.getView().getTitle().equals(ForgeMainMenu.title); + } +} diff --git a/src/main/java/io/github/math0898/rpgframework/systems/Forge.java b/src/main/java/io/github/math0898/rpgframework/forge/ForgeMainMenu.java similarity index 97% rename from src/main/java/io/github/math0898/rpgframework/systems/Forge.java rename to src/main/java/io/github/math0898/rpgframework/forge/ForgeMainMenu.java index a6e5336..97ab40a 100644 --- a/src/main/java/io/github/math0898/rpgframework/systems/Forge.java +++ b/src/main/java/io/github/math0898/rpgframework/forge/ForgeMainMenu.java @@ -1,4 +1,4 @@ -package io.github.math0898.rpgframework.systems; +package io.github.math0898.rpgframework.forge; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -21,7 +21,7 @@ import static org.bukkit.enchantments.Enchantment.*; import static org.bukkit.Material.*; -public class Forge { +public class ForgeMainMenu { private static final ItemStack forgeIndicator = ItemsManager.createItem(ANVIL, 1, ChatColor.DARK_GREEN + "" + ChatColor.BOLD + "Forge", new String[]{ @@ -58,8 +58,8 @@ public static void forgeClose (InventoryCloseEvent e) { switch (indicator.getType()) { case ORANGE_STAINED_GLASS_PANE -> player.getInventory().addItem(forge.getItem(22)); case RED_STAINED_GLASS_PANE, LIME_STAINED_GLASS_PANE -> { - player.getInventory().addItem(forge.getItem(11)); - player.getInventory().addItem(forge.getItem(15)); + if (forge.getItem(11) != null) player.getInventory().addItem(forge.getItem(11)); + if (forge.getItem(15) != null)player.getInventory().addItem(forge.getItem(15)); } } } diff --git a/src/main/java/io/github/math0898/rpgframework/main.java b/src/main/java/io/github/math0898/rpgframework/main.java index 2883040..df93ef0 100644 --- a/src/main/java/io/github/math0898/rpgframework/main.java +++ b/src/main/java/io/github/math0898/rpgframework/main.java @@ -5,7 +5,7 @@ import io.github.math0898.rpgframework.items.ItemManager; import io.github.math0898.rpgframework.parties.PartyCommand; import io.github.math0898.rpgframework.parties.PartyManager; -import io.github.math0898.rpgframework.systems.GodEventListener; +import io.github.math0898.rpgframework.forge.ForgeEventListener; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.event.Listener; @@ -72,7 +72,7 @@ public void onEnable () { //Register damage listeners Bukkit.getPluginManager().registerEvents(new AdvancedDamageHandler(), this); - Bukkit.getPluginManager().registerEvents(new GodEventListener(), this); // todo remove me! + Bukkit.getPluginManager().registerEvents(new ForgeEventListener(), this); // todo remove me! PartyManager.init(); PlayerManager.init(); Objects.requireNonNull(Bukkit.getPluginCommand("party")).setExecutor(new PartyCommand()); diff --git a/src/main/java/io/github/math0898/rpgframework/systems/GodEventListener.java b/src/main/java/io/github/math0898/rpgframework/systems/GodEventListener.java deleted file mode 100644 index 41aed9a..0000000 --- a/src/main/java/io/github/math0898/rpgframework/systems/GodEventListener.java +++ /dev/null @@ -1,59 +0,0 @@ -package io.github.math0898.rpgframework.systems; - -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.block.Action; -import org.bukkit.event.inventory.*; -import org.bukkit.inventory.Inventory; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.inventory.InventoryView; - -import java.util.Objects; - -import static io.github.math0898.rpgframework.systems.Forge.*; - -public class GodEventListener implements Listener { - - /** - * When inventory slots are clicked. - */ - @EventHandler - public void invClick(InventoryClickEvent e) { - - Inventory clicked = e.getClickedInventory(); - InventoryView open = e.getWhoClicked().getOpenInventory(); - - if (clicked == null) return; - if (open.getTitle().equals(title)) forgeClicked(e); - } - - /** - * Called when a player interacts. - */ - @EventHandler - public void onPlayerInteract(PlayerInteractEvent event) { - - if (event.getAction() == Action.RIGHT_CLICK_BLOCK && Objects.requireNonNull(event.getClickedBlock()).getType() == Material.ANVIL) { - - Block blockClicked = event.getClickedBlock(); - Player player = event.getPlayer(); - - if (blockClicked.getWorld().getBlockAt(blockClicked.getX(), blockClicked.getY() - 1, blockClicked.getZ()).getType() == Material.NETHERITE_BLOCK) { - event.setCancelled(true); - Forge.forgeMenu(player); - } - } - } - - - /** - * Called when an inventory is closed. - */ - @EventHandler - public void onInventoryClose(InventoryCloseEvent event) { - if (event.getPlayer().getOpenInventory().getTitle().equals(Forge.title)) forgeClose(event); - } -} diff --git a/src/main/java/sugaku/rpg/framework/menus/ForgeManager.java b/src/main/java/sugaku/rpg/framework/menus/ForgeManager.java deleted file mode 100644 index 12f4e23..0000000 --- a/src/main/java/sugaku/rpg/framework/menus/ForgeManager.java +++ /dev/null @@ -1,194 +0,0 @@ -//package sugaku.rpg.framework.menus; -// -//import org.bukkit.Bukkit; -//import org.bukkit.ChatColor; -//import org.bukkit.Sound; -//import org.bukkit.enchantments.Enchantment; -//import org.bukkit.entity.HumanEntity; -//import org.bukkit.entity.Player; -//import org.bukkit.event.inventory.InventoryClickEvent; -//import org.bukkit.event.inventory.InventoryCloseEvent; -//import org.bukkit.inventory.Inventory; -//import org.bukkit.inventory.InventoryView; -//import org.bukkit.inventory.ItemStack; -//import org.bukkit.inventory.meta.EnchantmentStorageMeta; -//import org.bukkit.inventory.meta.ItemMeta; -//import sugaku.rpg.framework.items.ItemsManager; -// -//import java.util.*; -// -//import static sugaku.rpg.main.plugin; -//import static org.bukkit.enchantments.Enchantment.*; -//import static org.bukkit.Material.*; -// -//public class ForgeManager { -// -// private static final ItemStack forgeIndicator = ItemsManager.createItem(ANVIL, 1, -// ChatColor.DARK_GREEN + "" + ChatColor.BOLD + "Forge", new String[]{ -// ChatColor.GRAY + "Welcome to the forge!", -// ChatColor.GRAY + "Place the items you would like to", -// ChatColor.GRAY + "combine in the two empty slots then", -// ChatColor.GRAY + "click the green glass pane to forge."}); -// -// public static final String title = ChatColor.DARK_GREEN + "" + ChatColor.BOLD + "Forge"; -// -// private static int pendingCost = -1; -// -// private static void buildForgeMenu (Inventory inv) { -// ItemStack fill = ItemsManager.createItem(BLACK_STAINED_GLASS_PANE, 1, " "); -// for (int i = 0; i < 54; i++) inv.setItem(i, fill); -// inv.setItem(49, forgeIndicator); -// inv.setItem(11, new ItemStack(AIR)); -// inv.setItem(15, new ItemStack(AIR)); -// Objects.requireNonNull(inv.getItem(22)).setType(ORANGE_STAINED_GLASS_PANE); -// Objects.requireNonNull(inv.getItem(31)).setType(RED_STAINED_GLASS_PANE); -// } -// -// public static void forgeMenu (Player p) { -// Inventory i = plugin.getServer().createInventory(p.getPlayer(), 54, title); -// buildForgeMenu(i); -// p.openInventory(i); -// } -// -// public static void forgeClose (InventoryCloseEvent e) { -// HumanEntity player = e.getPlayer(); -// Inventory forge = e.getPlayer().getOpenInventory().getTopInventory(); -// ItemStack indicator = forge.getItem(31); -// if (indicator == null) return; -// switch (indicator.getType()) { -// case ORANGE_STAINED_GLASS_PANE -> player.getInventory().addItem(forge.getItem(22)); -// case RED_STAINED_GLASS_PANE, LIME_STAINED_GLASS_PANE -> { -// player.getInventory().addItem(forge.getItem(11)); -// player.getInventory().addItem(forge.getItem(15)); -// } -// } -// } -// -// public static void forgeClicked (InventoryClickEvent event) { -// ArrayList clickable = new ArrayList<>(); -// clickable.add(11); -// clickable.add(15); -// Player player = (Player) event.getWhoClicked(); -// if ((clickable.contains(event.getSlot()) || !Objects.requireNonNull(event.getClickedInventory()).contains(forgeIndicator))) { -// Bukkit.getScheduler().runTaskLater(plugin, () -> forgeUpdate(event.getWhoClicked().getOpenInventory(), player), 1); -// } else if (event.getSlot() == 31 && Objects.requireNonNull(event.getCurrentItem()).getType() == LIME_STAINED_GLASS_PANE) { -// player.setLevel(player.getLevel() - pendingCost); -// player.playSound(player.getLocation(), Sound.BLOCK_ANVIL_USE, 0.8f, 0.5f); -// event.setCancelled(true); -// Objects.requireNonNull(event.getClickedInventory()).setItem(11, new ItemStack( AIR)); -// Objects.requireNonNull(event.getClickedInventory()).setItem(15, new ItemStack( AIR)); -// ItemStack item = new ItemStack( ORANGE_STAINED_GLASS_PANE); -// ItemMeta meta = item.getItemMeta(); -// assert meta != null; -// meta.setDisplayName(ChatColor.BOLD + "" + ChatColor.GREEN + "Forged"); -// item.setItemMeta(meta); -// event.getClickedInventory().setItem(31, item); -// } else if (!(event.getSlot() == 22 && Objects.requireNonNull(Objects.requireNonNull(event.getClickedInventory()).getItem(31)).getType() == ORANGE_STAINED_GLASS_PANE)) event.setCancelled(true); -// } -// -// private static void forgeUpdate (InventoryView view, Player player) { -// Inventory forge = view.getTopInventory(); -// ItemStack item1 = forge.getItem(11); -// ItemStack item2 = forge.getItem(15); -// if (Objects.requireNonNull(forge.getItem(31)).getType() == ORANGE_STAINED_GLASS_PANE) return; -// if (item1 != null && item2 != null) { -// ItemStack book; -// ItemStack target; -// if (item1.getType() == ENCHANTED_BOOK) { book = item1; target = item2; } -// else if (item2.getType() == ENCHANTED_BOOK) { book = item2; target = item1; } -// else { failure(forge, "One item must be a book!"); return; } -// if (legalEnchants(((EnchantmentStorageMeta) Objects.requireNonNull(book.getItemMeta())).getStoredEnchants().keySet(), target)) { -// int cost = calculateCost(((EnchantmentStorageMeta) Objects.requireNonNull(book.getItemMeta())).getStoredEnchants().values()); -// if (cost <= player.getLevel()) { -// ItemStack item = new ItemStack( LIME_STAINED_GLASS_PANE); -// ItemMeta meta = item.getItemMeta(); -// assert meta != null; -// meta.setDisplayName(ChatColor.BOLD + "" + ChatColor.GREEN + "Forge!"); -// ArrayList lore = new ArrayList<>(); -// lore.add(ChatColor.GRAY + "This will cost: " + ChatColor.GREEN + cost + " levels" + ChatColor.GRAY + "."); -// meta.setLore(lore); -// item.setItemMeta(meta); -// forge.setItem(31, item); -// pendingCost = cost; -// } else { -// failure(forge, "Not enough levels! <" + cost + ">"); -// } -// -// ItemStack result = target.clone(); -// ItemMeta meta = result.getItemMeta(); -// assert meta != null; -// if (!meta.hasDisplayName()) meta.setDisplayName(ItemsManager.increaseRarity(ItemsManager.genName(result.getType().toString().toLowerCase().toCharArray()))); -// result.setItemMeta(meta); -// result.addUnsafeEnchantments(((EnchantmentStorageMeta) Objects.requireNonNull(book.getItemMeta())).getStoredEnchants()); -// forge.setItem(22, result); -// } -// else failure(forge, "Not a legal enchant!"); -// } else failure(forge, "Please add your items!"); -// } -// -// private static boolean legalEnchants (Set checking, ItemStack item) { -// ArrayList legal = new ArrayList<>(); -// //Trident Enchants -// switch(item.getType()) { -// case TRIDENT: -// legal.add(RIPTIDE); -// legal.add(CHANNELING); -// legal.add(LOYALTY); -// case IRON_SWORD: case WOODEN_SWORD: case STONE_SWORD: case GOLDEN_SWORD: case DIAMOND_SWORD: case NETHERITE_SWORD: case WOODEN_AXE: case STONE_AXE: case GOLDEN_AXE: case IRON_AXE: -// case DIAMOND_AXE: case NETHERITE_AXE: -// legal.add(IMPALING); -// break; -// } -// //Sword Enchants -// switch(item.getType()) { -// case IRON_SWORD: case WOODEN_SWORD: case STONE_SWORD: case GOLDEN_SWORD: case DIAMOND_SWORD: case NETHERITE_SWORD: -// legal.add( SWEEPING_EDGE); -// case WOODEN_AXE: case STONE_AXE: case GOLDEN_AXE: case IRON_AXE: case DIAMOND_AXE: case NETHERITE_AXE: case TRIDENT: -// legal.add(DAMAGE_ALL); -// legal.add(DAMAGE_ARTHROPODS); -// legal.add(FIRE_ASPECT); -// legal.add(LOOT_BONUS_MOBS); -// legal.add(KNOCKBACK); -// legal.add(DAMAGE_UNDEAD); -// legal.add(MENDING); -// legal.add(DURABILITY); -// legal.add(VANISHING_CURSE); -// break; -// } -// //Armor enchants -// switch(item.getType()) { -// case LEATHER_BOOTS, LEATHER_LEGGINGS, LEATHER_CHESTPLATE, LEATHER_HELMET, IRON_BOOTS, IRON_LEGGINGS, -// IRON_CHESTPLATE, IRON_HELMET, CHAINMAIL_BOOTS, CHAINMAIL_LEGGINGS, CHAINMAIL_CHESTPLATE, -// CHAINMAIL_HELMET, GOLDEN_BOOTS, GOLDEN_LEGGINGS, GOLDEN_CHESTPLATE, GOLDEN_HELMET, DIAMOND_BOOTS, -// DIAMOND_LEGGINGS, DIAMOND_CHESTPLATE, DIAMOND_HELMET, NETHERITE_BOOTS, NETHERITE_LEGGINGS, -// NETHERITE_CHESTPLATE, NETHERITE_HELMET -> -// legal.addAll(Arrays.asList( PROTECTION_ENVIRONMENTAL, PROTECTION_FIRE, PROTECTION_PROJECTILE, -// PROTECTION_EXPLOSIONS, MENDING, VANISHING_CURSE, DURABILITY)); -// -// } -// if (legal.isEmpty()) return false; -// for (Enchantment c: checking) if (!legal.contains(c)) return false; -// return true; -// } -// -// private static void failure (Inventory i, String m) { -// ItemStack item = new ItemStack( RED_STAINED_GLASS_PANE); -// ItemMeta meta = item.getItemMeta(); -// assert meta != null; -// meta.setDisplayName(ChatColor.RED + "" + ChatColor.BOLD + m); -// item.setItemMeta(meta); -// i.setItem(31, item); -// item = new ItemStack( ORANGE_STAINED_GLASS_PANE); -// meta = item.getItemMeta(); -// assert meta != null; -// meta.setDisplayName(" "); -// item.setItemMeta(meta); -// i.setItem(22, item); -// } -// -// private static int calculateCost (Collection total) { -// int running = 0; -// for (Integer i: total) running += (i * 10); -// return running; -// } -//} From e3552763dc5a7a0adf9aa78fe05efa67523e135f Mon Sep 17 00:00:00 2001 From: math0898 <25396616+math0898@users.noreply.github.com> Date: Fri, 28 Apr 2023 22:20:18 -0500 Subject: [PATCH 2/9] Forge Redesign - Redesigned Forge system. - Renamed Forging to Honing. - Created ItemUtility class to eventually replace sugaku...ItemManager. --- .../forge/ForgeEventListener.java | 8 +- .../rpgframework/forge/ForgeManager.java | 78 ++++++++++ .../rpgframework/forge/ForgeMenu.java | 82 ++++++++++ .../{ForgeMainMenu.java => HoningMenu.java} | 57 ++++--- .../rpgframework/items/ItemUtility.java | 147 ++++++++++++++++++ .../io/github/math0898/rpgframework/main.java | 3 +- 6 files changed, 345 insertions(+), 30 deletions(-) create mode 100644 src/main/java/io/github/math0898/rpgframework/forge/ForgeManager.java create mode 100644 src/main/java/io/github/math0898/rpgframework/forge/ForgeMenu.java rename src/main/java/io/github/math0898/rpgframework/forge/{ForgeMainMenu.java => HoningMenu.java} (84%) create mode 100644 src/main/java/io/github/math0898/rpgframework/items/ItemUtility.java diff --git a/src/main/java/io/github/math0898/rpgframework/forge/ForgeEventListener.java b/src/main/java/io/github/math0898/rpgframework/forge/ForgeEventListener.java index 79d2a0a..d90674d 100644 --- a/src/main/java/io/github/math0898/rpgframework/forge/ForgeEventListener.java +++ b/src/main/java/io/github/math0898/rpgframework/forge/ForgeEventListener.java @@ -30,7 +30,7 @@ public void invClick (InventoryClickEvent event) { Inventory clicked = event.getClickedInventory(); if (clicked == null) return; - ForgeMainMenu.forgeClicked(event); + ForgeManager.getInstance().onClick(event); } /** @@ -52,7 +52,7 @@ public void onPlayerInteract (PlayerInteractEvent event) { if (base.getType() != Material.NETHERITE_BLOCK) return; event.setCancelled(true); - ForgeMainMenu.forgeMenu(event.getPlayer()); + ForgeManager.getInstance().openMenu(event.getPlayer()); } @@ -63,7 +63,7 @@ public void onPlayerInteract (PlayerInteractEvent event) { */ @EventHandler public void onInventoryClose (InventoryCloseEvent event) { - if (isForgeMenu(event)) ForgeMainMenu.forgeClose(event); + if (isForgeMenu(event)) ForgeManager.getInstance().onClose(event); } /** @@ -73,6 +73,6 @@ public void onInventoryClose (InventoryCloseEvent event) { * @return True if the given inventory event involves the forge. */ public boolean isForgeMenu (InventoryEvent event) { - return event.getView().getTitle().equals(ForgeMainMenu.title); + return event.getView().getTitle().startsWith(ForgeMenu.FORGE_MENUS_PREFIX); } } diff --git a/src/main/java/io/github/math0898/rpgframework/forge/ForgeManager.java b/src/main/java/io/github/math0898/rpgframework/forge/ForgeManager.java new file mode 100644 index 0000000..e654601 --- /dev/null +++ b/src/main/java/io/github/math0898/rpgframework/forge/ForgeManager.java @@ -0,0 +1,78 @@ +package io.github.math0898.rpgframework.forge; + +import io.github.math0898.rpgframework.main; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; + +import java.util.HashMap; +import java.util.Map; + +/** + * The Forge Manager wrangles and makes all ForgeMenus accessible to the rest of the plugin. + * + * @author Sugaku + */ +public class ForgeManager { + + /** + * A map of the registered ForgeMenus. + */ + private final Map menus = new HashMap<>(); + + /** + * The static reference to the single instance of the ForgeManager at runtime. + */ + private static ForgeManager forgeManager = null; + + /** + * Creates a new forge manager by registering the event listener and menus. + */ + private ForgeManager () { + Bukkit.getPluginManager().registerEvents(new ForgeEventListener(), main.plugin); + for (ForgeMenu m : new ForgeMenu[]{ new HoningMenu() }) menus.put(m.getMenuTitle(), m); + } + + /** + * Accessor method for the single instance of the ForgeManager. + * + * @return The ForgeManager instance in use. + */ + public static ForgeManager getInstance () { + if (forgeManager == null) forgeManager = new ForgeManager(); + return forgeManager; + } + + /** + * Called whenever a ForgeMenu is requested to be opened. We then pass this onto the appropriate menu. + * + * @param player The player that should have the forge opened to. + */ + public void openMenu (Player player) { + // todo: Create and implement a forge main menu. + ForgeMenu m = menus.get(ForgeMenu.FORGE_MENUS_PREFIX + ChatColor.DARK_GRAY + ": Honing"); + if (m != null) m.openMenu(player); + } + + /** + * Called whenever a ForgeMenu is clicked. This is then passed onto the appropriate menu. + * + * @param event The inventory click event. + */ + public void onClick (InventoryClickEvent event) { + ForgeMenu m = menus.get(event.getView().getTitle()); + if (m != null) m.onClick(event); + } + + /** + * Called whenever a ForgeMenu is closed. We then pass this onto the menu which needs this information. + * + * @param event The inventory close event. + */ + public void onClose (InventoryCloseEvent event) { + ForgeMenu m = menus.get(event.getView().getTitle()); + if (m != null) m.onClose(event); + } +} diff --git a/src/main/java/io/github/math0898/rpgframework/forge/ForgeMenu.java b/src/main/java/io/github/math0898/rpgframework/forge/ForgeMenu.java new file mode 100644 index 0000000..54b4c03 --- /dev/null +++ b/src/main/java/io/github/math0898/rpgframework/forge/ForgeMenu.java @@ -0,0 +1,82 @@ +package io.github.math0898.rpgframework.forge; + +import io.github.math0898.rpgframework.items.ItemUtility; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import static org.bukkit.Material.*; + +/** + * The ForgeMenu is a general definition of menus used throughout the Forge system. + * + * @author Sugaku + */ +public abstract class ForgeMenu { + + /** + * A constant value which prefixes any menu involving the forge. + */ + public static final String FORGE_MENUS_PREFIX = ChatColor.DARK_GREEN.toString() + ChatColor.BOLD + "Forge"; + + /** + * The title of this specific ForgeMenu. + */ + private final String menuTitle; + + /** + * Creates a ForgeMenu using the given subtitle. + * + * @param subtitle The title to append to the default title. + */ + public ForgeMenu (String subtitle) { + menuTitle = FORGE_MENUS_PREFIX + ChatColor.DARK_GRAY + ": " + subtitle; + } + + /** + * Accessor method for the title of this menu. + * + * @return The title of this menu. + */ + public String getMenuTitle () { + return menuTitle; + } + + /** + * Builds the items that are placed into the ForgeMenu. + * + * @param inv The inventory to place the built items into. + */ + protected void buildForgeMenu (Inventory inv) { + ItemStack fill = ItemUtility.createItem(BLACK_STAINED_GLASS_PANE, 1, " ", false); + for (int i = 0; i < 54; i++) inv.setItem(i, fill); + } + + /** + * Opens this menu to the given player. + * + * @param p The player whom should have this menu opened to. + */ + public void openMenu (Player p) { + Inventory i = Bukkit.getServer().createInventory(p.getPlayer(), 54, menuTitle); + buildForgeMenu(i); + p.openInventory(i); + } + + /** + * Called when a player closes this menu. + * + * @param event The relevant inventory close event. + */ + public abstract void onClose (InventoryCloseEvent event); + + /** + * Called whenever a player clicks on an inventory slot with this menu open. + * + * @param event The relevant inventory click event. + */ + public abstract void onClick (InventoryClickEvent event); +} diff --git a/src/main/java/io/github/math0898/rpgframework/forge/ForgeMainMenu.java b/src/main/java/io/github/math0898/rpgframework/forge/HoningMenu.java similarity index 84% rename from src/main/java/io/github/math0898/rpgframework/forge/ForgeMainMenu.java rename to src/main/java/io/github/math0898/rpgframework/forge/HoningMenu.java index 97ab40a..4b77cc3 100644 --- a/src/main/java/io/github/math0898/rpgframework/forge/ForgeMainMenu.java +++ b/src/main/java/io/github/math0898/rpgframework/forge/HoningMenu.java @@ -1,5 +1,6 @@ package io.github.math0898.rpgframework.forge; +import io.github.math0898.rpgframework.items.ItemUtility; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Sound; @@ -21,22 +22,30 @@ import static org.bukkit.enchantments.Enchantment.*; import static org.bukkit.Material.*; -public class ForgeMainMenu { +public class HoningMenu extends ForgeMenu { - private static final ItemStack forgeIndicator = ItemsManager.createItem(ANVIL, 1, - ChatColor.DARK_GREEN + "" + ChatColor.BOLD + "Forge", new String[]{ - ChatColor.GRAY + "Welcome to the forge!", + private final ItemStack forgeIndicator = ItemUtility.createItem(EXPERIENCE_BOTTLE, 1, + ChatColor.BLUE + "" + ChatColor.BOLD + "Honing", new String[]{ + ChatColor.GRAY + "Welcome to Honing!", ChatColor.GRAY + "Place the items you would like to", - ChatColor.GRAY + "combine in the two empty slots then", - ChatColor.GRAY + "click the green glass pane to forge."}); + ChatColor.GRAY + "hone with the book to apply in the", + ChatColor.GRAY + "two slots. Then click the green", + ChatColor.GRAY + "glass pane to hone."}, false); - public static final String title = ChatColor.DARK_GREEN + "" + ChatColor.BOLD + "Forge"; + public final String title = ChatColor.DARK_GREEN + "" + ChatColor.BOLD + "Forge"; - private static int pendingCost = -1; + private int pendingCost = -1; - private static void buildForgeMenu (Inventory inv) { - ItemStack fill = ItemsManager.createItem(BLACK_STAINED_GLASS_PANE, 1, " "); - for (int i = 0; i < 54; i++) inv.setItem(i, fill); + /** + * Creates a Honing Menu. + */ + public HoningMenu () { + super("Honing"); + } + + @Override + protected void buildForgeMenu (Inventory inv) { + super.buildForgeMenu(inv); inv.setItem(49, forgeIndicator); inv.setItem(11, new ItemStack(AIR)); inv.setItem(15, new ItemStack(AIR)); @@ -44,27 +53,25 @@ private static void buildForgeMenu (Inventory inv) { Objects.requireNonNull(inv.getItem(31)).setType(RED_STAINED_GLASS_PANE); } - public static void forgeMenu (Player p) { - Inventory i = Bukkit.getServer().createInventory(p.getPlayer(), 54, title); - buildForgeMenu(i); - p.openInventory(i); - } - - public static void forgeClose (InventoryCloseEvent e) { + @Override + public void onClose (InventoryCloseEvent e) { HumanEntity player = e.getPlayer(); Inventory forge = e.getPlayer().getOpenInventory().getTopInventory(); ItemStack indicator = forge.getItem(31); if (indicator == null) return; switch (indicator.getType()) { - case ORANGE_STAINED_GLASS_PANE -> player.getInventory().addItem(forge.getItem(22)); + case ORANGE_STAINED_GLASS_PANE -> { + if (forge.getItem(22) != null) player.getInventory().addItem(forge.getItem(22)); + } case RED_STAINED_GLASS_PANE, LIME_STAINED_GLASS_PANE -> { if (forge.getItem(11) != null) player.getInventory().addItem(forge.getItem(11)); - if (forge.getItem(15) != null)player.getInventory().addItem(forge.getItem(15)); + if (forge.getItem(15) != null) player.getInventory().addItem(forge.getItem(15)); } } } - public static void forgeClicked (InventoryClickEvent event) { + @Override + public void onClick (InventoryClickEvent event) { ArrayList clickable = new ArrayList<>(); clickable.add(11); clickable.add(15); @@ -86,7 +93,7 @@ public static void forgeClicked (InventoryClickEvent event) { } else if (!(event.getSlot() == 22 && Objects.requireNonNull(Objects.requireNonNull(event.getClickedInventory()).getItem(31)).getType() == ORANGE_STAINED_GLASS_PANE)) event.setCancelled(true); } - private static void forgeUpdate (InventoryView view, Player player) { + private void forgeUpdate (InventoryView view, Player player) { Inventory forge = view.getTopInventory(); ItemStack item1 = forge.getItem(11); ItemStack item2 = forge.getItem(15); @@ -126,7 +133,7 @@ private static void forgeUpdate (InventoryView view, Player player) { } else failure(forge, "Please add your items!"); } - private static boolean legalEnchants (Set checking, ItemStack item) { + private boolean legalEnchants (Set checking, ItemStack item) { ArrayList legal = new ArrayList<>(); //Trident Enchants switch(item.getType()) { @@ -171,7 +178,7 @@ private static boolean legalEnchants (Set checking, ItemStack item) return true; } - private static void failure (Inventory i, String m) { + private void failure (Inventory i, String m) { ItemStack item = new ItemStack( RED_STAINED_GLASS_PANE); ItemMeta meta = item.getItemMeta(); assert meta != null; @@ -186,7 +193,7 @@ private static void failure (Inventory i, String m) { i.setItem(22, item); } - private static int calculateCost (Collection total) { + private int calculateCost (Collection total) { int running = 0; for (Integer i: total) running += (i * 10); return running; diff --git a/src/main/java/io/github/math0898/rpgframework/items/ItemUtility.java b/src/main/java/io/github/math0898/rpgframework/items/ItemUtility.java new file mode 100644 index 0000000..d2125e1 --- /dev/null +++ b/src/main/java/io/github/math0898/rpgframework/items/ItemUtility.java @@ -0,0 +1,147 @@ +package io.github.math0898.rpgframework.items; + +import org.bukkit.Color; +import org.bukkit.Material; +import org.bukkit.attribute.Attribute; +import org.bukkit.attribute.AttributeModifier; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.inventory.meta.LeatherArmorMeta; + +import java.util.ArrayList; +import java.util.Collections; + +/** + * Utility class used to make item creation easier. + * + * @author Sugaku + */ +public class ItemUtility { + + /** + * Applies the given strings to the lore of the given meta. + * + * @param m The meta which will have the lore. + * @param lines The lines of lore. + */ + public static void setLore (ItemMeta m, String[] lines) { + ArrayList l = new ArrayList<>(); + Collections.addAll(l, lines); + m.setLore(l); + } + + /** + * Creates a custom item of the given material, name, lore, and unbreakable flag. + * + * @param m The material for the item. + * @param i The number of items in the stack. + * @param n The name of the item. + * @param unbreakable Whether this item should be unbreakable or not. + */ + public static ItemStack createItem (Material m, int i, String n, boolean unbreakable) { + return createItem(m, i, n, new String[]{}, unbreakable); + } + + /** + * Creates a custom item of the given material and name. Used to create items in line. + * + * @param m The material for the item. + * @param i The number of items in the stack. + * @param n The name of the item. + */ + public static ItemStack createItem (Material m, int i, String n) { return createItem(m, i, n, new String[]{}); } + + /** + * Creates a custom item of the given material, name, and lore. Used to created items in line. Using this generally + * also reduces scope. + * + * @param m The material for the item. + * @param i The number of items in the stack. + * @param n The name of the item. + * @param lines The lines of lore. + */ + public static ItemStack createItem (Material m, int i, String n, String[] lines) { + return createItem(m, i, n, lines, true); + } + + /** + * Creates a custom item of the given material, name, lore, and unbreakable flag. Used to created items in line. + * Using this generally also reduces scope. + * + * @param m The material for the item. + * @param i The number of items in the stack. + * @param n The name of the item. + * @param lines The lines of lore. + * @param unbreakable Whether this item should be unbreakable or not. + */ + public static ItemStack createItem (Material m, int i, String n, String[] lines, boolean unbreakable) { + ItemStack r = new ItemStack(m, i); + ItemMeta meta = r.getItemMeta(); + assert meta != null; + setLore(meta, lines); + meta.setDisplayName(n); + meta.setUnbreakable(unbreakable); + r.setItemMeta(meta); + return r; + } + + /** + * Creates a custom item of the given material, name, lore, and array of attribute modifiers. Used to create items + * in line. This method can significantly reduce scope. + * + * @param m The material for the item. + * @param i The number of items in the stack. + * @param n The name of the item. + * @param lines The lines of lore. + * @param attributes The attributes to be added to the item. + */ + public static ItemStack createItem (Material m, int i, String n, String[] lines, AttributeModifier[] attributes) { + ItemStack item = createItem(m, i, n, lines); + ItemMeta meta = item.getItemMeta(); + assert meta != null; + for (AttributeModifier a: attributes) meta.addAttributeModifier(Attribute.valueOf(a.getName()), a); + item.setItemMeta(meta); + return item; + } + + /** + * Creates a leather armor item with the given dyes. It's implied that each item stack will only have one item. + * + * @param m The material for the item. + * @param n The name of the item. + * @param lines The lines of lore. + * @param r The red of the dye. + * @param g The green of the dye. + * @param b The blue of the dye. + */ + public static ItemStack createLeatherArmor (Material m, String n, String[] lines, int r, int g, int b) { + if (m != Material.LEATHER_BOOTS && m != Material.LEATHER_LEGGINGS && m != Material.LEATHER_CHESTPLATE && m != Material.LEATHER_HELMET) return null; + ItemStack item = createItem(m, 1, n, lines); + LeatherArmorMeta meta = (LeatherArmorMeta) item.getItemMeta(); + assert meta != null; + meta.setColor(Color.fromRGB(r, g, b)); + item.setItemMeta(meta); + return item; + } + + /** + * Creates a leather armor item with the given dyes. This also handles the adding attributes to the leather armor. + * + * @param m The material for the item. + * @param n The name of the item. + * @param lines The lines of lore. + * @param r The red of the dye. + * @param g The green of the dye. + * @param b The blue of the dye. + * @param attributes The attributes to be added to the item. + */ + public static ItemStack createLeatherArmor (Material m, String n, String[] lines, int r, int g, int b, AttributeModifier[] attributes) { + ItemStack item = createLeatherArmor(m, n, lines, r, g, b); + if (item == null) return null; + ItemMeta meta = item.getItemMeta(); + assert meta != null; + for (AttributeModifier a: attributes) meta.addAttributeModifier(Attribute.valueOf(a.getName()), a); + item.setItemMeta(meta); + return item; + } +} diff --git a/src/main/java/io/github/math0898/rpgframework/main.java b/src/main/java/io/github/math0898/rpgframework/main.java index df93ef0..8bb03d0 100644 --- a/src/main/java/io/github/math0898/rpgframework/main.java +++ b/src/main/java/io/github/math0898/rpgframework/main.java @@ -1,6 +1,7 @@ package io.github.math0898.rpgframework; import io.github.math0898.rpgframework.damage.AdvancedDamageHandler; +import io.github.math0898.rpgframework.forge.ForgeManager; import io.github.math0898.rpgframework.items.GiveCommand; import io.github.math0898.rpgframework.items.ItemManager; import io.github.math0898.rpgframework.parties.PartyCommand; @@ -72,9 +73,9 @@ public void onEnable () { //Register damage listeners Bukkit.getPluginManager().registerEvents(new AdvancedDamageHandler(), this); - Bukkit.getPluginManager().registerEvents(new ForgeEventListener(), this); // todo remove me! PartyManager.init(); PlayerManager.init(); + ForgeManager.getInstance(); Objects.requireNonNull(Bukkit.getPluginCommand("party")).setExecutor(new PartyCommand()); Objects.requireNonNull(Bukkit.getPluginCommand("party")).setTabCompleter(PartyCommand.autocomplete); From 77dd48ca416252c9686279141051aba9214d3f70 Mon Sep 17 00:00:00 2001 From: math0898 <25396616+math0898@users.noreply.github.com> Date: Fri, 28 Apr 2023 22:54:31 -0500 Subject: [PATCH 3/9] ItemUtility Redesign - Rebuilt ItemUtility into an ItemBuilder. - Propogated changes. - Added permission to rpg-give. - Removed unused imports. --- .../rpgframework/forge/ForgeMenu.java | 7 +- .../rpgframework/forge/HoningMenu.java | 8 +- .../rpgframework/items/ItemBuilder.java | 199 ++++++++++++++++++ .../rpgframework/items/ItemUtility.java | 147 ------------- .../io/github/math0898/rpgframework/main.java | 1 - src/main/resources/plugin.yml | 1 + 6 files changed, 208 insertions(+), 155 deletions(-) create mode 100644 src/main/java/io/github/math0898/rpgframework/items/ItemBuilder.java delete mode 100644 src/main/java/io/github/math0898/rpgframework/items/ItemUtility.java diff --git a/src/main/java/io/github/math0898/rpgframework/forge/ForgeMenu.java b/src/main/java/io/github/math0898/rpgframework/forge/ForgeMenu.java index 54b4c03..149b392 100644 --- a/src/main/java/io/github/math0898/rpgframework/forge/ForgeMenu.java +++ b/src/main/java/io/github/math0898/rpgframework/forge/ForgeMenu.java @@ -1,6 +1,6 @@ package io.github.math0898.rpgframework.forge; -import io.github.math0898.rpgframework.items.ItemUtility; +import io.github.math0898.rpgframework.items.ItemBuilder; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.entity.Player; @@ -8,7 +8,8 @@ import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; -import static org.bukkit.Material.*; + +import static org.bukkit.Material.BLACK_STAINED_GLASS_PANE; /** * The ForgeMenu is a general definition of menus used throughout the Forge system. @@ -51,7 +52,7 @@ public String getMenuTitle () { * @param inv The inventory to place the built items into. */ protected void buildForgeMenu (Inventory inv) { - ItemStack fill = ItemUtility.createItem(BLACK_STAINED_GLASS_PANE, 1, " ", false); + ItemStack fill = new ItemBuilder(BLACK_STAINED_GLASS_PANE, 1, " ").build(); for (int i = 0; i < 54; i++) inv.setItem(i, fill); } diff --git a/src/main/java/io/github/math0898/rpgframework/forge/HoningMenu.java b/src/main/java/io/github/math0898/rpgframework/forge/HoningMenu.java index 4b77cc3..23f30a0 100644 --- a/src/main/java/io/github/math0898/rpgframework/forge/HoningMenu.java +++ b/src/main/java/io/github/math0898/rpgframework/forge/HoningMenu.java @@ -1,6 +1,6 @@ package io.github.math0898.rpgframework.forge; -import io.github.math0898.rpgframework.items.ItemUtility; +import io.github.math0898.rpgframework.items.ItemBuilder; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Sound; @@ -24,13 +24,13 @@ public class HoningMenu extends ForgeMenu { - private final ItemStack forgeIndicator = ItemUtility.createItem(EXPERIENCE_BOTTLE, 1, - ChatColor.BLUE + "" + ChatColor.BOLD + "Honing", new String[]{ + private final ItemStack forgeIndicator = new ItemBuilder(EXPERIENCE_BOTTLE, 1, + ChatColor.BLUE.toString() + ChatColor.BOLD + "Honing").setLore(new String[]{ ChatColor.GRAY + "Welcome to Honing!", ChatColor.GRAY + "Place the items you would like to", ChatColor.GRAY + "hone with the book to apply in the", ChatColor.GRAY + "two slots. Then click the green", - ChatColor.GRAY + "glass pane to hone."}, false); + ChatColor.GRAY + "glass pane to hone."}).build(); public final String title = ChatColor.DARK_GREEN + "" + ChatColor.BOLD + "Forge"; diff --git a/src/main/java/io/github/math0898/rpgframework/items/ItemBuilder.java b/src/main/java/io/github/math0898/rpgframework/items/ItemBuilder.java new file mode 100644 index 0000000..6132e64 --- /dev/null +++ b/src/main/java/io/github/math0898/rpgframework/items/ItemBuilder.java @@ -0,0 +1,199 @@ +package io.github.math0898.rpgframework.items; + +import org.bukkit.Color; +import org.bukkit.Material; +import org.bukkit.attribute.Attribute; +import org.bukkit.attribute.AttributeModifier; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.inventory.meta.LeatherArmorMeta; + +import java.util.Arrays; + +/** + * Utility class used to make item creation easier. Follows the builder paradigm. + * + * @author Sugaku + */ +public class ItemBuilder { + + /** + * The material to use when creating a new ItemStack. + */ + private Material material; + + /** + * The amount of items in the stack of this ItemStack. + */ + private int amount = 1; + + /** + * The name to give this ItemStack. + */ + private String name = null; + + /** + * Whether this item is unbreakable or not. + */ + private boolean unbreakable = false; + + /** + * The lore to assign to this item. + */ + private String[] lore = null; + + /** + * RGB values to assign to leather armor when constructing leather. + */ + private int[] rgb = null; + + /** + * The attribute modifiers to add to this ItemStack. + */ + private AttributeModifier[] modifiers = null; + + /** + * Creates a new ItemBuilder with the given material as the base. + * + * @param material The material to use in item creation. + */ + public ItemBuilder (Material material) { + this.material = material; + } + + /** + * Creates a new ItemBuilder with the given material and name as the base. + * + * @param material The material to use in item creation. + * @param name The name to give this ItemStack. + */ + public ItemBuilder (Material material, String name) { + this.material = material; + this.name = name; + } + + /** + * Creates a new ItemBuilder with the given material and amount as the base. + * + * @param material The material to use in item creation. + * @param amount The amount of this item. + */ + public ItemBuilder (Material material, int amount) { + this.material = material; + this.amount = amount; + } + + /** + * Creates a new ItemBuilder with the given material, amount, and name as the base. + * + * @param material The material to use in item creation. + * @param amount The amount of this item. + * @param name The name of this item. + */ + public ItemBuilder (Material material, int amount, String name) { + this.material = material; + this.amount = amount; + this.name = name; + } + + /** + * Assigns a different material to this ItemStack. + * + * @param material The material to change this ItemStack to. + * @return This ItemBuilder object to allow chaining. + */ + public ItemBuilder setMaterial (Material material) { + this.material = material; + return this; + } + + /** + * Assigns the given name to this ItemStack. + * + * @param name The name to give this ItemStack. + * @return This ItemBuilder object to allow chaining. + */ + public ItemBuilder setName (String name) { + this.name = name; + return this; + } + + /** + * Sets the unbreakable flag to the given value for this ItemStack. + * + * @param unbreakable The value to assign to the unbreakable flag. + * @return This ItemBuilder object to allow chaining. + */ + public ItemBuilder setUnbreakable (boolean unbreakable) { + this.unbreakable = unbreakable; + return this; + } + + /** + * Sets the lore of this ItemStack. + * + * @param lore The lore to assign to this ItemStack. + * @return This ItemBuilder object to allow chaining. + */ + public ItemBuilder setLore (String[] lore) { + this.lore = lore; + return this; + } + + /** + * Sets the rgb value of this ItemStack using three ints. + * + * @param r The red value. + * @param g The green value. + * @param b The blue value. + * @return This ItemBuilder object to allow chaining. + */ + public ItemBuilder setRGB (int r, int g, int b) { + this.rgb = new int[]{ r, g, b}; + return this; + } + + /** + * Sets the rgb value of this ItemStack using an int array. + * + * @param rgb The rgb values to assign to this item. + * @return This ItemBuilder object to allow chaining. + */ + public ItemBuilder setRGB (int[] rgb) { + this.rgb = new int[]{ rgb[0], rgb[1], rgb[2] }; + return this; + } + + /** + * Sets the attribute modifiers to live on this ItemStack. + * + * @param modifiers The array of modifiers to apply to this item. + * @return This ItemBuilder object to allow chaining. + */ + public ItemBuilder setModifiers (AttributeModifier[] modifiers) { + this.modifiers = modifiers; + return this; + } + + /** + * Creates the ItemStack that was constructed using this builder. + * + * @return The ItemStack that results from this builder configuration. + */ + public ItemStack build () { + ItemStack i = new ItemStack(material, amount); + ItemMeta meta = i.getItemMeta(); + if (meta == null) return i; + if (name != null) meta.setDisplayName(name); + if (lore != null) meta.setLore(Arrays.asList(lore)); + if (rgb != null) + if (meta instanceof LeatherArmorMeta leather) + leather.setColor(Color.fromRGB(rgb[0], rgb[1], rgb[2])); + if (modifiers != null) + for (AttributeModifier m : modifiers) + meta.addAttributeModifier(Attribute.valueOf(m.getName()), m); + meta.setUnbreakable(unbreakable); + i.setItemMeta(meta); + return i; + } +} diff --git a/src/main/java/io/github/math0898/rpgframework/items/ItemUtility.java b/src/main/java/io/github/math0898/rpgframework/items/ItemUtility.java deleted file mode 100644 index d2125e1..0000000 --- a/src/main/java/io/github/math0898/rpgframework/items/ItemUtility.java +++ /dev/null @@ -1,147 +0,0 @@ -package io.github.math0898.rpgframework.items; - -import org.bukkit.Color; -import org.bukkit.Material; -import org.bukkit.attribute.Attribute; -import org.bukkit.attribute.AttributeModifier; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; -import org.bukkit.inventory.meta.LeatherArmorMeta; - -import java.util.ArrayList; -import java.util.Collections; - -/** - * Utility class used to make item creation easier. - * - * @author Sugaku - */ -public class ItemUtility { - - /** - * Applies the given strings to the lore of the given meta. - * - * @param m The meta which will have the lore. - * @param lines The lines of lore. - */ - public static void setLore (ItemMeta m, String[] lines) { - ArrayList l = new ArrayList<>(); - Collections.addAll(l, lines); - m.setLore(l); - } - - /** - * Creates a custom item of the given material, name, lore, and unbreakable flag. - * - * @param m The material for the item. - * @param i The number of items in the stack. - * @param n The name of the item. - * @param unbreakable Whether this item should be unbreakable or not. - */ - public static ItemStack createItem (Material m, int i, String n, boolean unbreakable) { - return createItem(m, i, n, new String[]{}, unbreakable); - } - - /** - * Creates a custom item of the given material and name. Used to create items in line. - * - * @param m The material for the item. - * @param i The number of items in the stack. - * @param n The name of the item. - */ - public static ItemStack createItem (Material m, int i, String n) { return createItem(m, i, n, new String[]{}); } - - /** - * Creates a custom item of the given material, name, and lore. Used to created items in line. Using this generally - * also reduces scope. - * - * @param m The material for the item. - * @param i The number of items in the stack. - * @param n The name of the item. - * @param lines The lines of lore. - */ - public static ItemStack createItem (Material m, int i, String n, String[] lines) { - return createItem(m, i, n, lines, true); - } - - /** - * Creates a custom item of the given material, name, lore, and unbreakable flag. Used to created items in line. - * Using this generally also reduces scope. - * - * @param m The material for the item. - * @param i The number of items in the stack. - * @param n The name of the item. - * @param lines The lines of lore. - * @param unbreakable Whether this item should be unbreakable or not. - */ - public static ItemStack createItem (Material m, int i, String n, String[] lines, boolean unbreakable) { - ItemStack r = new ItemStack(m, i); - ItemMeta meta = r.getItemMeta(); - assert meta != null; - setLore(meta, lines); - meta.setDisplayName(n); - meta.setUnbreakable(unbreakable); - r.setItemMeta(meta); - return r; - } - - /** - * Creates a custom item of the given material, name, lore, and array of attribute modifiers. Used to create items - * in line. This method can significantly reduce scope. - * - * @param m The material for the item. - * @param i The number of items in the stack. - * @param n The name of the item. - * @param lines The lines of lore. - * @param attributes The attributes to be added to the item. - */ - public static ItemStack createItem (Material m, int i, String n, String[] lines, AttributeModifier[] attributes) { - ItemStack item = createItem(m, i, n, lines); - ItemMeta meta = item.getItemMeta(); - assert meta != null; - for (AttributeModifier a: attributes) meta.addAttributeModifier(Attribute.valueOf(a.getName()), a); - item.setItemMeta(meta); - return item; - } - - /** - * Creates a leather armor item with the given dyes. It's implied that each item stack will only have one item. - * - * @param m The material for the item. - * @param n The name of the item. - * @param lines The lines of lore. - * @param r The red of the dye. - * @param g The green of the dye. - * @param b The blue of the dye. - */ - public static ItemStack createLeatherArmor (Material m, String n, String[] lines, int r, int g, int b) { - if (m != Material.LEATHER_BOOTS && m != Material.LEATHER_LEGGINGS && m != Material.LEATHER_CHESTPLATE && m != Material.LEATHER_HELMET) return null; - ItemStack item = createItem(m, 1, n, lines); - LeatherArmorMeta meta = (LeatherArmorMeta) item.getItemMeta(); - assert meta != null; - meta.setColor(Color.fromRGB(r, g, b)); - item.setItemMeta(meta); - return item; - } - - /** - * Creates a leather armor item with the given dyes. This also handles the adding attributes to the leather armor. - * - * @param m The material for the item. - * @param n The name of the item. - * @param lines The lines of lore. - * @param r The red of the dye. - * @param g The green of the dye. - * @param b The blue of the dye. - * @param attributes The attributes to be added to the item. - */ - public static ItemStack createLeatherArmor (Material m, String n, String[] lines, int r, int g, int b, AttributeModifier[] attributes) { - ItemStack item = createLeatherArmor(m, n, lines, r, g, b); - if (item == null) return null; - ItemMeta meta = item.getItemMeta(); - assert meta != null; - for (AttributeModifier a: attributes) meta.addAttributeModifier(Attribute.valueOf(a.getName()), a); - item.setItemMeta(meta); - return item; - } -} diff --git a/src/main/java/io/github/math0898/rpgframework/main.java b/src/main/java/io/github/math0898/rpgframework/main.java index 8bb03d0..8f65639 100644 --- a/src/main/java/io/github/math0898/rpgframework/main.java +++ b/src/main/java/io/github/math0898/rpgframework/main.java @@ -6,7 +6,6 @@ import io.github.math0898.rpgframework.items.ItemManager; import io.github.math0898.rpgframework.parties.PartyCommand; import io.github.math0898.rpgframework.parties.PartyManager; -import io.github.math0898.rpgframework.forge.ForgeEventListener; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.event.Listener; diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index ce5a0a9..d85c1bd 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -16,6 +16,7 @@ commands: party: description: Lets players join, leave, and manipulate parties. rpg-give: + permission: rpg.admin description: Gives custom rpg items to players. irpg: permission: rpg.admin From 83a8755fbde371a1e6c506b3b32137c48ba99338 Mon Sep 17 00:00:00 2001 From: math0898 <25396616+math0898@users.noreply.github.com> Date: Sat, 29 Apr 2023 13:27:16 -0500 Subject: [PATCH 4/9] Trimming and Cleaning - Refactored ItemsManager to remove creational methods. - Propograted changes. --- .../rpgframework/enemies/bosses/Boss.java | 14 +- .../rpgframework/forge/HoningMenu.java | 82 +++-- .../rpg/framework/items/ItemsManager.java | 281 ++++++------------ .../rpg/framework/menus/ClassesManager.java | 22 +- .../framework/menus/classes/AssassinMenu.java | 45 +-- .../rpg/framework/menus/classes/BardMenu.java | 34 +-- .../menus/classes/BerserkerMenu.java | 44 +-- .../rpg/framework/menus/classes/MainMenu.java | 85 +++--- .../framework/menus/classes/PaladinMenu.java | 30 +- .../menus/classes/PyromancerMenu.java | 30 +- .../rpg/mobs/teir1/eiryeras/EiryerasBoss.java | 80 +++-- .../rpg/mobs/teir1/feyrith/FeyrithBoss.java | 17 +- 12 files changed, 323 insertions(+), 441 deletions(-) diff --git a/src/main/java/io/github/math0898/rpgframework/enemies/bosses/Boss.java b/src/main/java/io/github/math0898/rpgframework/enemies/bosses/Boss.java index 6fd7f4f..1f444bf 100644 --- a/src/main/java/io/github/math0898/rpgframework/enemies/bosses/Boss.java +++ b/src/main/java/io/github/math0898/rpgframework/enemies/bosses/Boss.java @@ -4,6 +4,7 @@ import io.github.math0898.rpgframework.enemies.AI; import io.github.math0898.rpgframework.enemies.abilities.Ability; import io.github.math0898.rpgframework.enemies.abilities.UndeadAura; +import io.github.math0898.rpgframework.items.ItemBuilder; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; @@ -138,12 +139,13 @@ public void spawnBoss (Location locale) { e.setCustomNameVisible(true); e.setCustomName(ChatColor.DARK_GRAY + "[" + ChatColor.DARK_GREEN + "RPG" + ChatColor.DARK_GRAY + "] " + Rarity.toColor(rarity) + name); - if (items.get("helmet") != null) Objects.requireNonNull(e.getEquipment()).setHelmet(new ItemStack(items.get("helmet"))); // TODO: Armor - if (items.get("chestplate") != null) Objects.requireNonNull(e.getEquipment()).setChestplate(new ItemStack(items.get("chestplate"))); - if (items.get("leggings") != null) Objects.requireNonNull(e.getEquipment()).setLeggings(new ItemStack(items.get("leggings"))); - if (items.get("boots") != null) Objects.requireNonNull(e.getEquipment()).setBoots(new ItemStack(items.get("boots"))); - if (items.get("main-hand") != null) Objects.requireNonNull(e.getEquipment()).setItemInMainHand(sugaku.rpg.framework.items.ItemsManager.createItem(items.get("main-hand"), 1, "", new String[]{}, new AttributeModifier[]{ new AttributeModifier(new UUID(0l, 1l), "generic.dmg", damage, AttributeModifier.Operation.ADD_NUMBER, EquipmentSlot.HAND)})); // TODO: Refactor - if (items.get("off-hand") != null) Objects.requireNonNull(e.getEquipment()).setItemInOffHand(new ItemStack(items.get("off-hand"))); + assert e.getEquipment() != null; + if (items.get("helmet") != null) e.getEquipment().setHelmet(new ItemStack(items.get("helmet"))); // TODO: Armor + if (items.get("chestplate") != null) e.getEquipment().setChestplate(new ItemStack(items.get("chestplate"))); + if (items.get("leggings") != null) e.getEquipment().setLeggings(new ItemStack(items.get("leggings"))); + if (items.get("boots") != null) e.getEquipment().setBoots(new ItemStack(items.get("boots"))); + if (items.get("main-hand") != null) e.getEquipment().setItemInMainHand(new ItemBuilder(items.get("main-hand")).setModifiers(new AttributeModifier[]{ new AttributeModifier(new UUID(0l, 1l), "generic.dmg", damage, AttributeModifier.Operation.ADD_NUMBER, EquipmentSlot.HAND)}).build()); // TODO: Refactor + if (items.get("off-hand") != null) e.getEquipment().setItemInOffHand(new ItemStack(items.get("off-hand"))); e.setHealth(health); diff --git a/src/main/java/io/github/math0898/rpgframework/forge/HoningMenu.java b/src/main/java/io/github/math0898/rpgframework/forge/HoningMenu.java index 23f30a0..1d9b360 100644 --- a/src/main/java/io/github/math0898/rpgframework/forge/HoningMenu.java +++ b/src/main/java/io/github/math0898/rpgframework/forge/HoningMenu.java @@ -9,6 +9,7 @@ import org.bukkit.entity.Player; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.event.inventory.InventoryType; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryView; import org.bukkit.inventory.ItemStack; @@ -24,7 +25,7 @@ public class HoningMenu extends ForgeMenu { - private final ItemStack forgeIndicator = new ItemBuilder(EXPERIENCE_BOTTLE, 1, + private static final ItemStack HONING_INDICATOR = new ItemBuilder(EXPERIENCE_BOTTLE, 1, ChatColor.BLUE.toString() + ChatColor.BOLD + "Honing").setLore(new String[]{ ChatColor.GRAY + "Welcome to Honing!", ChatColor.GRAY + "Place the items you would like to", @@ -32,8 +33,6 @@ public class HoningMenu extends ForgeMenu { ChatColor.GRAY + "two slots. Then click the green", ChatColor.GRAY + "glass pane to hone."}).build(); - public final String title = ChatColor.DARK_GREEN + "" + ChatColor.BOLD + "Forge"; - private int pendingCost = -1; /** @@ -46,7 +45,7 @@ public HoningMenu () { @Override protected void buildForgeMenu (Inventory inv) { super.buildForgeMenu(inv); - inv.setItem(49, forgeIndicator); + inv.setItem(49, HONING_INDICATOR); inv.setItem(11, new ItemStack(AIR)); inv.setItem(15, new ItemStack(AIR)); Objects.requireNonNull(inv.getItem(22)).setType(ORANGE_STAINED_GLASS_PANE); @@ -72,13 +71,14 @@ public void onClose (InventoryCloseEvent e) { @Override public void onClick (InventoryClickEvent event) { + assert event.getClickedInventory() != null; ArrayList clickable = new ArrayList<>(); clickable.add(11); clickable.add(15); Player player = (Player) event.getWhoClicked(); - if ((clickable.contains(event.getSlot()) || !Objects.requireNonNull(event.getClickedInventory()).contains(forgeIndicator))) { - Bukkit.getScheduler().runTaskLater(plugin, () -> forgeUpdate(event.getWhoClicked().getOpenInventory(), player), 1); - } else if (event.getSlot() == 31 && Objects.requireNonNull(event.getCurrentItem()).getType() == LIME_STAINED_GLASS_PANE) { + Bukkit.getScheduler().runTask(plugin, () -> forgeUpdate(event.getWhoClicked().getOpenInventory(), player)); + if (clickable.contains(event.getSlot()) || event.getClickedInventory().getType() != InventoryType.CHEST) event.setCancelled(false); + else if (event.getSlot() == 31 && Objects.requireNonNull(event.getCurrentItem()).getType() == LIME_STAINED_GLASS_PANE) { player.setLevel(player.getLevel() - pendingCost); player.playSound(player.getLocation(), Sound.BLOCK_ANVIL_USE, 0.8f, 0.5f); event.setCancelled(true); @@ -87,7 +87,7 @@ public void onClick (InventoryClickEvent event) { ItemStack item = new ItemStack( ORANGE_STAINED_GLASS_PANE); ItemMeta meta = item.getItemMeta(); assert meta != null; - meta.setDisplayName(ChatColor.BOLD + "" + ChatColor.GREEN + "Forged"); + meta.setDisplayName(ChatColor.BOLD.toString() + ChatColor.GREEN + "Forged"); item.setItemMeta(meta); event.getClickedInventory().setItem(31, item); } else if (!(event.getSlot() == 22 && Objects.requireNonNull(Objects.requireNonNull(event.getClickedInventory()).getItem(31)).getType() == ORANGE_STAINED_GLASS_PANE)) event.setCancelled(true); @@ -110,7 +110,7 @@ private void forgeUpdate (InventoryView view, Player player) { ItemStack item = new ItemStack( LIME_STAINED_GLASS_PANE); ItemMeta meta = item.getItemMeta(); assert meta != null; - meta.setDisplayName(ChatColor.BOLD + "" + ChatColor.GREEN + "Forge!"); + meta.setDisplayName(ChatColor.BOLD.toString() + ChatColor.GREEN + "Forge!"); ArrayList lore = new ArrayList<>(); lore.add(ChatColor.GRAY + "This will cost: " + ChatColor.GREEN + cost + " levels" + ChatColor.GRAY + "."); meta.setLore(lore); @@ -133,46 +133,36 @@ private void forgeUpdate (InventoryView view, Player player) { } else failure(forge, "Please add your items!"); } + /** + * Checks whether the given set of enchantments are legal to apply to the given item. + * + * @param checking The set of enchantments to check against legal enchantments. + * @param item The item that determines what enchantments are legal. + * @return True if all the given enchantments are legal for the given item. Otherwise, false. + */ private boolean legalEnchants (Set checking, ItemStack item) { - ArrayList legal = new ArrayList<>(); + String type = item.getType().toString(); + // Global Enchants + ArrayList legal = new ArrayList<>(Arrays.asList(MENDING, DURABILITY)); + + // Tool Enchants + if (type.endsWith("_AXE") || type.endsWith("_HOE") || type.endsWith("_SHOVEL") || type.endsWith("_PICKAXE")) legal.add(DIG_SPEED); + //Trident Enchants - switch(item.getType()) { - case TRIDENT: - legal.add(RIPTIDE); - legal.add(CHANNELING); - legal.add(LOYALTY); - case IRON_SWORD: case WOODEN_SWORD: case STONE_SWORD: case GOLDEN_SWORD: case DIAMOND_SWORD: case NETHERITE_SWORD: case WOODEN_AXE: case STONE_AXE: case GOLDEN_AXE: case IRON_AXE: - case DIAMOND_AXE: case NETHERITE_AXE: - legal.add(IMPALING); - break; - } + if (type.endsWith("TRIDENT")) legal.addAll(Arrays.asList(RIPTIDE, CHANNELING, LOYALTY)); + if (type.endsWith("_SWORD") || type.endsWith("_AXE")) legal.add(IMPALING); + //Sword Enchants - switch(item.getType()) { - case IRON_SWORD: case WOODEN_SWORD: case STONE_SWORD: case GOLDEN_SWORD: case DIAMOND_SWORD: case NETHERITE_SWORD: - legal.add( SWEEPING_EDGE); - case WOODEN_AXE: case STONE_AXE: case GOLDEN_AXE: case IRON_AXE: case DIAMOND_AXE: case NETHERITE_AXE: case TRIDENT: - legal.add(DAMAGE_ALL); - legal.add(DAMAGE_ARTHROPODS); - legal.add(FIRE_ASPECT); - legal.add(LOOT_BONUS_MOBS); - legal.add(KNOCKBACK); - legal.add(DAMAGE_UNDEAD); - legal.add(MENDING); - legal.add(DURABILITY); - legal.add(VANISHING_CURSE); - break; - } + if (type.endsWith("_SWORD")) legal.add(SWEEPING_EDGE); + if (type.endsWith("_SWORD") || type.endsWith("_AXE") || type.endsWith("TRIDENT")) + legal.addAll(Arrays.asList(DAMAGE_ALL, DAMAGE_ARTHROPODS, DAMAGE_UNDEAD, FIRE_ASPECT, LOOT_BONUS_MOBS, KNOCKBACK)); + //Armor enchants - switch(item.getType()) { - case LEATHER_BOOTS, LEATHER_LEGGINGS, LEATHER_CHESTPLATE, LEATHER_HELMET, IRON_BOOTS, IRON_LEGGINGS, - IRON_CHESTPLATE, IRON_HELMET, CHAINMAIL_BOOTS, CHAINMAIL_LEGGINGS, CHAINMAIL_CHESTPLATE, - CHAINMAIL_HELMET, GOLDEN_BOOTS, GOLDEN_LEGGINGS, GOLDEN_CHESTPLATE, GOLDEN_HELMET, DIAMOND_BOOTS, - DIAMOND_LEGGINGS, DIAMOND_CHESTPLATE, DIAMOND_HELMET, NETHERITE_BOOTS, NETHERITE_LEGGINGS, - NETHERITE_CHESTPLATE, NETHERITE_HELMET -> - legal.addAll(Arrays.asList( PROTECTION_ENVIRONMENTAL, PROTECTION_FIRE, PROTECTION_PROJECTILE, - PROTECTION_EXPLOSIONS, MENDING, VANISHING_CURSE, DURABILITY)); - - } + if (type.endsWith("_BOOTS")) legal.addAll(Arrays.asList(PROTECTION_FALL, SOUL_SPEED, DEPTH_STRIDER)); + if (type.endsWith("_LEGGINGS")) legal.add(SWIFT_SNEAK); + if (type.endsWith("_HELMET")) legal.addAll(Arrays.asList(WATER_WORKER, OXYGEN)); + if (type.endsWith("_BOOTS") || type.endsWith("_LEGGINGS") || type.endsWith("_CHESTPLATE") || type.endsWith("_HELMET")) + legal.addAll(Arrays.asList(PROTECTION_ENVIRONMENTAL, PROTECTION_FIRE, PROTECTION_PROJECTILE, PROTECTION_EXPLOSIONS)); if (legal.isEmpty()) return false; for (Enchantment c: checking) if (!legal.contains(c)) return false; return true; @@ -182,7 +172,7 @@ private void failure (Inventory i, String m) { ItemStack item = new ItemStack( RED_STAINED_GLASS_PANE); ItemMeta meta = item.getItemMeta(); assert meta != null; - meta.setDisplayName(ChatColor.RED + "" + ChatColor.BOLD + m); + meta.setDisplayName(ChatColor.RED.toString() + ChatColor.BOLD + m); item.setItemMeta(meta); i.setItem(31, item); item = new ItemStack( ORANGE_STAINED_GLASS_PANE); diff --git a/src/main/java/sugaku/rpg/framework/items/ItemsManager.java b/src/main/java/sugaku/rpg/framework/items/ItemsManager.java index 1b0a4b9..32d9653 100644 --- a/src/main/java/sugaku/rpg/framework/items/ItemsManager.java +++ b/src/main/java/sugaku/rpg/framework/items/ItemsManager.java @@ -1,5 +1,6 @@ package sugaku.rpg.framework.items; +import io.github.math0898.rpgframework.items.ItemBuilder; import org.bukkit.ChatColor; import org.bukkit.Color; import org.bukkit.Material; @@ -20,11 +21,6 @@ public final class ItemsManager { - /** - * An arraylist which contains all the boss spawn items. - */ - private static final ArrayList bossSpawns = new ArrayList<>(); - /** * The rare Dark Helmet custom item. */ @@ -58,22 +54,22 @@ public final class ItemsManager { /** * The rare spawn item for Krusk. */ - public static ItemStack KruskSpawn = createItem(Material.WHEAT, 1, ChatColor.BLUE + "Krusk Boss Spawn", new String[]{ + public static ItemStack KruskSpawn = new ItemBuilder(Material.WHEAT, 1, ChatColor.BLUE + "Krusk Boss Spawn").setLore(new String[]{ ChatColor.GRAY + "Drop this item anywhere to spawn", ChatColor.GREEN + "Krusk, Undead General" + ChatColor.GRAY + " on the spot.", ChatColor.GRAY + "Attacking bosses whilst they are in", ChatColor.GRAY + "water will cause you to get struck", - ChatColor.GRAY + "by lighting."}); + ChatColor.GRAY + "by lighting."}).build(); /** * The legendary spawn item for Feyrith. */ - public static ItemStack FeyrithSpawn = createItem(Material.GOLD_INGOT, 1, ChatColor.GOLD + "Feyrith Boss Spawn", new String[]{ + public static ItemStack FeyrithSpawn = new ItemBuilder(Material.GOLD_INGOT, 1, ChatColor.GOLD + "Feyrith Boss Spawn").setLore(new String[]{ ChatColor.GRAY + "Drop this item anywhere to spawn", ChatColor.BLUE + "Feyrith, Apprentice Mage" + ChatColor.GRAY + " on the spot.", ChatColor.GRAY + "Attacking bosses whilst they are in", ChatColor.GRAY + "water will cause you to get struck", - ChatColor.GRAY + "by lighting."}); + ChatColor.GRAY + "by lighting."}).build(); /** * The uncommon undead chestplate custom item. @@ -83,12 +79,12 @@ public final class ItemsManager { /** * The rare lore of Krusk. */ - public static ItemStack KruskLore = createItem(Material.WHEAT, 1, ChatColor.GOLD + "Krusk's Lore", new String[]{ + public static ItemStack KruskLore = new ItemBuilder(Material.WHEAT, 1, ChatColor.GOLD + "Krusk's Lore").setLore(new String[]{ ChatColor.GREEN + "Krusk " + ChatColor.GRAY + "was a general for a small", ChatColor.GRAY + "time noble named " + ChatColor.LIGHT_PURPLE + "Kairon" + ChatColor.GRAY + ". For", ChatColor.GRAY + "this noble, " + ChatColor.GREEN + "Krusk " + ChatColor.GRAY + "was given the", ChatColor.GRAY + "fairly easy task of defending", - ChatColor.GRAY + "farmers from stray beasts."}); + ChatColor.GRAY + "farmers from stray beasts."}).build(); /** * An arraylist of all the custom items in the game. @@ -118,10 +114,6 @@ public static void init() { items.add(UndeadChestplate); items.add(KruskLore); items.addAll(EiryerasBoss.getBossItems()); - - bossSpawns.add(FeyrithSpawn); - bossSpawns.add(KruskSpawn); - bossSpawns.add(EiryerasSpawn); } /** @@ -281,8 +273,8 @@ public static void createUndeadChestplate() { lore.add(ChatColor.GRAY + "This chestplate, forged from iron,"); lore.add(ChatColor.GRAY + "will defend the user against most"); lore.add(ChatColor.GRAY + "attacks they may face."); - lore.add(ChatColor.GRAY + ""); - lore.add(ChatColor.GRAY + "" + ChatColor.ITALIC + "Issue Date: "); + lore.add(ChatColor.GRAY.toString()); + lore.add(ChatColor.GRAY.toString() + ChatColor.ITALIC + "Issue Date: "); lore.add(ChatColor.WHITE + " I5 - Pretits - Ve"); meta.setLore(lore); @@ -315,18 +307,26 @@ public static void updateArmor(ItemStack item) { EquipmentSlot slot = EquipmentSlot.HAND; int slotUuid = 0; - meta.setDisplayName(ChatColor.WHITE + genName(item.getType().toString().toLowerCase().toCharArray())); + meta.setDisplayName(genName(item.getType().toString().toLowerCase().toCharArray())); if (meta.hasEnchants()) meta.setDisplayName(increaseRarity(meta.getDisplayName())); - switch(item.getType()) { - case LEATHER_BOOTS: case IRON_BOOTS: case CHAINMAIL_BOOTS: case GOLDEN_BOOTS: case DIAMOND_BOOTS: case NETHERITE_BOOTS: - slot = EquipmentSlot.FEET; slotUuid = 1; break; - case LEATHER_LEGGINGS: case IRON_LEGGINGS: case CHAINMAIL_LEGGINGS: case GOLDEN_LEGGINGS: case DIAMOND_LEGGINGS: case NETHERITE_LEGGINGS: - slot = EquipmentSlot.LEGS; slotUuid = 2; break; - case LEATHER_CHESTPLATE: case IRON_CHESTPLATE: case CHAINMAIL_CHESTPLATE: case GOLDEN_CHESTPLATE: case DIAMOND_CHESTPLATE: case NETHERITE_CHESTPLATE: - slot = EquipmentSlot.CHEST; slotUuid = 3; break; - case LEATHER_HELMET: case IRON_HELMET: case CHAINMAIL_HELMET: case GOLDEN_HELMET: case DIAMOND_HELMET: case NETHERITE_HELMET: - slot = EquipmentSlot.HEAD; slotUuid = 4; break; + switch (item.getType()) { + case LEATHER_BOOTS, IRON_BOOTS, CHAINMAIL_BOOTS, GOLDEN_BOOTS, DIAMOND_BOOTS, NETHERITE_BOOTS -> { + slot = EquipmentSlot.FEET; + slotUuid = 1; + } + case LEATHER_LEGGINGS, IRON_LEGGINGS, CHAINMAIL_LEGGINGS, GOLDEN_LEGGINGS, DIAMOND_LEGGINGS, NETHERITE_LEGGINGS -> { + slot = EquipmentSlot.LEGS; + slotUuid = 2; + } + case LEATHER_CHESTPLATE, IRON_CHESTPLATE, CHAINMAIL_CHESTPLATE, GOLDEN_CHESTPLATE, DIAMOND_CHESTPLATE, NETHERITE_CHESTPLATE -> { + slot = EquipmentSlot.CHEST; + slotUuid = 3; + } + case LEATHER_HELMET, IRON_HELMET, CHAINMAIL_HELMET, GOLDEN_HELMET, DIAMOND_HELMET, NETHERITE_HELMET -> { + slot = EquipmentSlot.HEAD; + slotUuid = 4; + } } meta.removeAttributeModifier(Attribute.GENERIC_ARMOR); @@ -390,65 +390,57 @@ public static String increaseRarity(String s) { * Returns the int value of the piece of armor. This is a helper method. */ private static int calArmor(Material m) { - - switch(m) { - case LEATHER_BOOTS: case LEATHER_HELMET: case GOLDEN_BOOTS: case CHAINMAIL_BOOTS: return 1; - case LEATHER_LEGGINGS: case IRON_BOOTS: case GOLDEN_HELMET: case CHAINMAIL_HELMET: case IRON_HELMET: return 2; - case LEATHER_CHESTPLATE: case GOLDEN_LEGGINGS: case DIAMOND_HELMET: case DIAMOND_BOOTS: case NETHERITE_BOOTS: case NETHERITE_HELMET: return 3; - case CHAINMAIL_LEGGINGS: return 4; - case GOLDEN_CHESTPLATE: case CHAINMAIL_CHESTPLATE: case IRON_LEGGINGS: return 5; - case IRON_CHESTPLATE: case DIAMOND_LEGGINGS: case NETHERITE_LEGGINGS: return 6; - case DIAMOND_CHESTPLATE: case NETHERITE_CHESTPLATE: return 8; - } - - return -1; + return switch (m) { + case LEATHER_BOOTS, LEATHER_HELMET, GOLDEN_BOOTS, CHAINMAIL_BOOTS -> 1; + case LEATHER_LEGGINGS, IRON_BOOTS, GOLDEN_HELMET, CHAINMAIL_HELMET, IRON_HELMET -> 2; + case LEATHER_CHESTPLATE, GOLDEN_LEGGINGS, DIAMOND_HELMET, DIAMOND_BOOTS, NETHERITE_BOOTS, NETHERITE_HELMET -> 3; + case CHAINMAIL_LEGGINGS -> 4; + case GOLDEN_CHESTPLATE, CHAINMAIL_CHESTPLATE, IRON_LEGGINGS -> 5; + case IRON_CHESTPLATE, DIAMOND_LEGGINGS, NETHERITE_LEGGINGS -> 6; + case DIAMOND_CHESTPLATE, NETHERITE_CHESTPLATE -> 8; + default -> -1; + }; } /** * Calculates the int health value of the piece of armor. This is a helper method. */ private static int calHealth(Material m) { - - switch(m) { - case LEATHER_HELMET: case LEATHER_BOOTS: case LEATHER_LEGGINGS: return 1; - case LEATHER_CHESTPLATE: return 2; - case GOLDEN_BOOTS: case GOLDEN_LEGGINGS: case GOLDEN_CHESTPLATE: case GOLDEN_HELMET: case CHAINMAIL_HELMET: case CHAINMAIL_BOOTS: return 3; - case CHAINMAIL_LEGGINGS: case CHAINMAIL_CHESTPLATE: return 4; - case IRON_HELMET: case IRON_BOOTS: return 5; - case IRON_LEGGINGS: return 6; - case IRON_CHESTPLATE: return 7; - case NETHERITE_BOOTS: case DIAMOND_BOOTS: return 8; - case NETHERITE_HELMET: case DIAMOND_HELMET: return 10; - case NETHERITE_LEGGINGS: case DIAMOND_LEGGINGS: return 12; - case NETHERITE_CHESTPLATE: case DIAMOND_CHESTPLATE: return 30; - } - - return -1; + return switch (m) { + case LEATHER_HELMET, LEATHER_BOOTS, LEATHER_LEGGINGS -> 1; + case LEATHER_CHESTPLATE -> 2; + case GOLDEN_BOOTS, GOLDEN_LEGGINGS, GOLDEN_CHESTPLATE, GOLDEN_HELMET, CHAINMAIL_HELMET, CHAINMAIL_BOOTS -> 3; + case CHAINMAIL_LEGGINGS, CHAINMAIL_CHESTPLATE -> 4; + case IRON_HELMET, IRON_BOOTS -> 5; + case IRON_LEGGINGS -> 6; + case IRON_CHESTPLATE -> 7; + case NETHERITE_BOOTS, DIAMOND_BOOTS -> 8; + case NETHERITE_HELMET, DIAMOND_HELMET -> 10; + case NETHERITE_LEGGINGS, DIAMOND_LEGGINGS -> 12; + case NETHERITE_CHESTPLATE, DIAMOND_CHESTPLATE -> 30; + default -> -1; + }; } /** * Calculates the int armor toughness value of the piece of armor. This is a helper method. */ private static int calToughness(Material m) { - - switch(m) { - case DIAMOND_BOOTS: case DIAMOND_LEGGINGS: case DIAMOND_CHESTPLATE: case DIAMOND_HELMET: return 2; - case NETHERITE_BOOTS: case NETHERITE_LEGGINGS: case NETHERITE_CHESTPLATE: case NETHERITE_HELMET: return 3; - } - - return 0; + return switch (m) { + case DIAMOND_BOOTS, DIAMOND_LEGGINGS, DIAMOND_CHESTPLATE, DIAMOND_HELMET -> 2; + case NETHERITE_BOOTS, NETHERITE_LEGGINGS, NETHERITE_CHESTPLATE, NETHERITE_HELMET -> 3; + default -> 0; + }; } /** * Calculates the double knockback resistance value of a piece of armor. This is a helper method. */ private static double calKnockback(Material m) { - - switch(m) { - case NETHERITE_BOOTS: case NETHERITE_LEGGINGS: case NETHERITE_CHESTPLATE: case NETHERITE_HELMET: return 0.1; - } - - return 0; + return switch (m) { + case NETHERITE_BOOTS, NETHERITE_LEGGINGS, NETHERITE_CHESTPLATE, NETHERITE_HELMET -> 0.1; + default -> 0; + }; } /** @@ -459,136 +451,29 @@ private static double calKnockback(Material m) { * @return The AttributeModifier with a unique UUID. */ public static AttributeModifier attributeModifier(Attribute a, double value, EquipmentSlot slot) { - int mod = -1; - switch (a) { - case GENERIC_MAX_HEALTH: mod = 1; break; - case GENERIC_ARMOR: mod = 2; break; - case GENERIC_ARMOR_TOUGHNESS: mod = 3; break; - case GENERIC_ATTACK_DAMAGE: mod = 4; break; - case GENERIC_KNOCKBACK_RESISTANCE: mod = 5; break; - case GENERIC_MOVEMENT_SPEED: mod = 6; break; - case GENERIC_LUCK: mod = 7; break; - case HORSE_JUMP_STRENGTH: mod = 8; break; - case GENERIC_ATTACK_SPEED: mod = 9; break; - case GENERIC_ATTACK_KNOCKBACK: mod = 10; break; - case GENERIC_FLYING_SPEED: mod = 11; break; - case GENERIC_FOLLOW_RANGE: mod = 12; break; - case ZOMBIE_SPAWN_REINFORCEMENTS: mod = 13; break; - } - int slotN = -1; - switch (slot) { - case FEET: slotN = 1; break; - case LEGS: slotN = 2; break; - case CHEST: slotN = 3; break; - case HEAD: slotN = 4; break; - case HAND: slotN = 5; break; - case OFF_HAND: slotN = 6; break; - } + int mod = switch (a) { + case GENERIC_MAX_HEALTH -> 1; + case GENERIC_ARMOR -> 2; + case GENERIC_ARMOR_TOUGHNESS -> 3; + case GENERIC_ATTACK_DAMAGE -> 4; + case GENERIC_KNOCKBACK_RESISTANCE -> 5; + case GENERIC_MOVEMENT_SPEED -> 6; + case GENERIC_LUCK -> 7; + case HORSE_JUMP_STRENGTH -> 8; + case GENERIC_ATTACK_SPEED -> 9; + case GENERIC_ATTACK_KNOCKBACK -> 10; + case GENERIC_FLYING_SPEED -> 11; + case GENERIC_FOLLOW_RANGE -> 12; + case ZOMBIE_SPAWN_REINFORCEMENTS -> 13; + }; + int slotN = switch (slot) { + case FEET -> 1; + case LEGS -> 2; + case CHEST -> 3; + case HEAD -> 4; + case HAND -> 5; + case OFF_HAND -> 6; + }; return new AttributeModifier(new UUID(slotN, mod), a.toString(), value, AttributeModifier.Operation.ADD_NUMBER, slot); } - - /** - * Returns the arraylist of items that are considered boss spawns. - */ - public static ArrayList getBossSpawns() { return bossSpawns; } - - /** - * Applies the given strings to the lore of the given meta. - * @param m The meta which will have the lore. - * @param lines The lines of lore. - */ - public static void setLore(ItemMeta m, String[] lines) { - ArrayList l = new ArrayList<>(); - Collections.addAll(l, lines); - m.setLore(l); - } - - /** - * Creates a custom item of the given material and name. Used to create items in line. - * - * @param m The material for the item. - * @param i The number of items in the stack. - * @param n The name of the item. - */ - public static ItemStack createItem(Material m, int i, String n) { return createItem(m, i, n, new String[]{}); } - - /** - * Creates a custom item of the given material, name, and lore. Used to created items in line. Using this generally - * also reduces scope. - * - * @param m The material for the item. - * @param i The number of items in the stack. - * @param n The name of the item. - * @param lines The lines of lore. - */ - public static ItemStack createItem(Material m, int i, String n, String[] lines) { - ItemStack r = new ItemStack(m, i); - ItemMeta meta = r.getItemMeta(); - assert meta != null; - setLore(meta, lines); - meta.setDisplayName(n); - meta.setUnbreakable(true); - r.setItemMeta(meta); - return r; - } - - /** - * Creates a custom item of the given material, name, lore, and array of attribute modifiers. Used to create items - * in line. This method can significantly reduce scope. - * - * @param m The material for the item. - * @param i The number of items in the stack. - * @param n The name of the item. - * @param lines The lines of lore. - * @param attributes The attributes to be added to the item. - */ - public static ItemStack createItem(Material m, int i, String n, String[] lines, AttributeModifier[] attributes) { - ItemStack item = createItem(m, i, n, lines); - ItemMeta meta = item.getItemMeta(); - assert meta != null; - for (AttributeModifier a: attributes) meta.addAttributeModifier(Attribute.valueOf(a.getName()), a); - item.setItemMeta(meta); - return item; - } - - /** - * Creates a leather armor item with the given dyes. It's implied that each item stack will only have one item. - * - * @param m The material for the item. - * @param n The name of the item. - * @param lines The lines of lore. - * @param r The red of the dye. - * @param g The green of the dye. - * @param b The blue of the dye. - */ - public static ItemStack createLeatherArmor(Material m, String n, String[] lines, int r, int g, int b) { - if (m != Material.LEATHER_BOOTS && m != Material.LEATHER_LEGGINGS && m != Material.LEATHER_CHESTPLATE && m != Material.LEATHER_HELMET) return null; - ItemStack item = createItem(m, 1, n, lines); - LeatherArmorMeta meta = (LeatherArmorMeta) item.getItemMeta(); - assert meta != null; - meta.setColor(Color.fromRGB(r, g, b)); - item.setItemMeta(meta); - return item; - } - - /** - * Creates a leather armor item with the given dyes. This also handles the adding attributes to the leather armor. - * - * @param m The material for the item. - * @param n The name of the item. - * @param lines The lines of lore. - * @param r The red of the dye. - * @param g The green of the dye. - * @param b The blue of the dye. - * @param attributes The attributes to be added to the item. - */ - public static ItemStack createLeatherArmor(Material m, String n, String[] lines, int r, int g, int b, AttributeModifier[] attributes) { - ItemStack item = createLeatherArmor(m, n, lines, r, g, b); - if (item == null) return null; - ItemMeta meta = item.getItemMeta(); - assert meta != null; - for (AttributeModifier a: attributes) meta.addAttributeModifier(Attribute.valueOf(a.getName()), a); - item.setItemMeta(meta); - return item; - } } diff --git a/src/main/java/sugaku/rpg/framework/menus/ClassesManager.java b/src/main/java/sugaku/rpg/framework/menus/ClassesManager.java index 005d21d..bfeaaad 100644 --- a/src/main/java/sugaku/rpg/framework/menus/ClassesManager.java +++ b/src/main/java/sugaku/rpg/framework/menus/ClassesManager.java @@ -1,12 +1,12 @@ package sugaku.rpg.framework.menus; +import io.github.math0898.rpgframework.items.ItemBuilder; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; -import sugaku.rpg.framework.items.ItemsManager; import sugaku.rpg.framework.menus.classes.*; import static sugaku.rpg.main.plugin; @@ -21,11 +21,11 @@ public class ClassesManager { * The title of the inventory and the name of the helper item in the main inventory. Additionally serves as the * prefix for other submenus. */ - public static final String title = ChatColor.BLUE + "" + ChatColor.BOLD + "Classes Menu"; + public static final String title = ChatColor.BLUE.toString() + ChatColor.BOLD + "Classes Menu"; - public static final ItemStack goBack = ItemsManager.createItem(Material.ARROW, 1, ChatColor.RED + "" + ChatColor.BOLD + "Go back"); + public static final ItemStack goBack = new ItemBuilder(Material.ARROW, 1, ChatColor.RED.toString() + ChatColor.BOLD + "Go back").build(); - public static final ItemStack fill = ItemsManager.createItem(Material.BLACK_STAINED_GLASS_PANE, 1, " "); + public static final ItemStack fill = new ItemBuilder(Material.BLACK_STAINED_GLASS_PANE, 1, " ").build(); private static final Menu MainMenu = new MainMenu(); @@ -48,13 +48,13 @@ public static void classMenu (Player p, String menu) { if (!menu.equals("main") && !menu.equals("None")) i = plugin.getServer().createInventory(p.getPlayer(), 54, title + ChatColor.DARK_GRAY + ": " + menu); else i = plugin.getServer().createInventory(p.getPlayer(), 54, title); - switch(menu) { - case "main": case "None": MainMenu.build(i, p); break; - case "Assassin": AssassinMenu.build(i, p); break; - case "Bard": BardMenu.build(i, p); break; - case "Berserker": BerserkerMenu.build(i, p); break; - case "Paladin": PaladinMenu.build(i, p); break; - case "Pyromancer": PyromancerMenu.build(i, p); break; + switch (menu) { + case "main", "None" -> MainMenu.build(i, p); + case "Assassin" -> AssassinMenu.build(i, p); + case "Bard" -> BardMenu.build(i, p); + case "Berserker" -> BerserkerMenu.build(i, p); + case "Paladin" -> PaladinMenu.build(i, p); + case "Pyromancer" -> PyromancerMenu.build(i, p); } p.openInventory(i); diff --git a/src/main/java/sugaku/rpg/framework/menus/classes/AssassinMenu.java b/src/main/java/sugaku/rpg/framework/menus/classes/AssassinMenu.java index db566e4..1116bbc 100644 --- a/src/main/java/sugaku/rpg/framework/menus/classes/AssassinMenu.java +++ b/src/main/java/sugaku/rpg/framework/menus/classes/AssassinMenu.java @@ -1,11 +1,11 @@ package sugaku.rpg.framework.menus.classes; +import io.github.math0898.rpgframework.items.ItemBuilder; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import sugaku.rpg.framework.classes.Classes; -import sugaku.rpg.framework.items.ItemsManager; import sugaku.rpg.framework.menus.Menu; import sugaku.rpg.framework.players.PlayerManager; @@ -20,12 +20,15 @@ public AssassinMenu(){} @Override public void onClick(int clicked, Player player) { - switch(clicked) { - case 49: classMenu(player, "main"); break; + switch (clicked) { + case 49 -> classMenu(player, "main"); // case 12: classMenu(player, "Invisibility"); break; // case 14: classMenu(player, "Poisoned Blade"); break; // case 16: classMenu(player, "Swiftness"); break; - case 28: Objects.requireNonNull(PlayerManager.getPlayer(player.getUniqueId())).joinClass(Classes.ASSASSIN); classMenu(player, "Assassin"); break; + case 28 -> { + Objects.requireNonNull(PlayerManager.getPlayer(player.getUniqueId())).joinClass(Classes.ASSASSIN); + classMenu(player, "Assassin"); + } // case 31: classMenu(player, "Heroic Dodge"); break; // case 33: classMenu(player, "Finesse"); break; } @@ -41,45 +44,44 @@ public void build(Inventory inv, Player p) { int level = getClassLvl(Classes.ASSASSIN); int xp = getClassXp(Classes.ASSASSIN); - inv.setItem(10, ItemsManager.createItem(Material.GHAST_TEAR, Math.max(1, classPoints), ChatColor.DARK_GREEN + "Class points: " + classPoints, new String[]{ + inv.setItem(10, new ItemBuilder(Material.GHAST_TEAR, Math.max(1, classPoints), ChatColor.DARK_GREEN + "Class points: " + classPoints).setLore(new String[]{ ChatColor.GRAY + "Spend class points to upgrade", ChatColor.GRAY + "class abilities and passives.", - ChatColor.GRAY + "One point is given per level."})); - inv.setItem(12, ItemsManager.createItem(Material.GOLDEN_CARROT, 1, ChatColor.DARK_AQUA + "Invisibility", new String[]{ + ChatColor.GRAY + "One point is given per level."}).build()); + inv.setItem(12, new ItemBuilder(Material.GOLDEN_CARROT, 1, ChatColor.DARK_AQUA + "Invisibility").setLore(new String[]{ ChatColor.GRAY + "Gain invisibility and increase", ChatColor.GRAY + "your dodge chance to 50%", ChatColor.GRAY + "Current Stats: ", ChatColor.GRAY + "- Duration: " + ChatColor.GREEN + 10, //TODO: add player upgrades - ChatColor.GRAY + "- Cooldown: " + ChatColor.GREEN + 30 + "s" /*^^^*/})); - inv.setItem(14, ItemsManager.createItem(Material.POISONOUS_POTATO, 1, ChatColor.DARK_AQUA + "Poisoned Blade", new String[]{ + ChatColor.GRAY + "- Cooldown: " + ChatColor.GREEN + 30 + "s" /*^^^*/}).build()); + inv.setItem(14, new ItemBuilder(Material.POISONOUS_POTATO, 1, ChatColor.DARK_AQUA + "Poisoned Blade").setLore(new String[]{ ChatColor.GRAY + "Poison your blade to weaken", ChatColor.GRAY + "your foes and deal insane", ChatColor.GRAY + "damage.", ChatColor.GRAY + "Current Stats: ", ChatColor.GRAY + "- Duration: " + ChatColor.GREEN + 10, //TODO: add player upgrades ChatColor.GRAY + "- Cooldown: " + ChatColor.GREEN + 60 + "s", - ChatColor.GRAY + "- Potency: " + ChatColor.GREEN + 1})); - inv.setItem(16, ItemsManager.createItem(Material.FEATHER, 1, ChatColor.LIGHT_PURPLE + "Swiftness", new String[]{ + ChatColor.GRAY + "- Potency: " + ChatColor.GREEN + 1}).build()); + inv.setItem(16, new ItemBuilder(Material.FEATHER, 1, ChatColor.LIGHT_PURPLE + "Swiftness").setLore(new String[]{ ChatColor.GRAY + "Evade your opponent's attacks", ChatColor.GRAY + "and clear the terrain with", ChatColor.GRAY + "unmatched skill.", ChatColor.GRAY + "Current Stats: ", ChatColor.GRAY + "- Evasion: " + ChatColor.GREEN + 10 + "%", //TODO: add player upgrades - ChatColor.GRAY + "- Swiftness: " + ChatColor.GREEN + 1})); + ChatColor.GRAY + "- Swiftness: " + ChatColor.GREEN + 1}).build()); if (Objects.requireNonNull(PlayerManager.getPlayer(p.getUniqueId())).getCombatClass() == Classes.ASSASSIN) { - inv.setItem(28, ItemsManager.createItem(Material.LAPIS_BLOCK, 1, ChatColor.BLUE + "Lvl: " + level, new String[]{ + inv.setItem(28, new ItemBuilder(Material.LAPIS_BLOCK, 1, ChatColor.BLUE + "Lvl: " + level).setLore(new String[]{ ChatColor.GRAY + "Slay bosses and RPG mobs to", ChatColor.GRAY + "gain xp for your active class.", "", - ChatColor.GRAY + "Xp until next level: " + ChatColor.GREEN + ((level*300) - xp), /*TODO: check that this equation works*/})); + ChatColor.GRAY + "Xp until next level: " + ChatColor.GREEN + ((level*300) - xp), /*TODO: check that this equation works*/}).build()); } else { - inv.setItem(28, ItemsManager.createItem(Material.EMERALD_BLOCK, 1, ChatColor.GREEN + "" + ChatColor.BOLD + "Join the class", new String[]{ + inv.setItem(28, new ItemBuilder(Material.EMERALD_BLOCK, 1, ChatColor.GREEN.toString() + ChatColor.BOLD + "Join the class").setLore(new String[]{ ChatColor.GRAY + "Click me to join the assassin", ChatColor.GRAY + "class! You will leave your", - ChatColor.GRAY + "current class."})); + ChatColor.GRAY + "current class."}).build()); } - - inv.setItem(31, ItemsManager.createItem(Material.TOTEM_OF_UNDYING, 1, ChatColor.GOLD + "Heroic Dodge", new String[]{ + inv.setItem(31, new ItemBuilder(Material.TOTEM_OF_UNDYING, 1, ChatColor.GOLD + "Heroic Dodge").setLore(new String[]{ ChatColor.GRAY + "Pulling off an incredible feat", ChatColor.GRAY + "to evade death, you are given", ChatColor.GRAY + "renewed stamina and insight", @@ -88,14 +90,13 @@ public void build(Inventory inv, Player p) { ChatColor.GRAY + "Current Stats: ", ChatColor.GRAY + "- Duration: " + ChatColor.GREEN + 10 + "s", //TODO: add player upgrades ChatColor.GRAY + "- Cooldown: " + ChatColor.GREEN + 300 + "s", - ChatColor.GRAY + "- Swiftness: " + ChatColor.GREEN + 2})); - inv.setItem(33, ItemsManager.createItem(Material.IRON_SWORD, 1, ChatColor.LIGHT_PURPLE + "Assassin's Finesse", new String[]{ + ChatColor.GRAY + "- Swiftness: " + ChatColor.GREEN + 2}).build()); + inv.setItem(33, new ItemBuilder(Material.IRON_SWORD, 1, ChatColor.LIGHT_PURPLE + "Assassin's Finesse").setLore(new String[]{ ChatColor.GRAY + "Through your many jobs you've", ChatColor.GRAY + "learned in the ins and outs of", ChatColor.GRAY + "the human body and know how to", ChatColor.GRAY + "inflict the most damage.", ChatColor.GRAY + "Current Stats: ", - ChatColor.GRAY + "- Damage Bonus: " + ChatColor.GREEN + 2 + "hp" /*TODO: add player upgrades*/})); - + ChatColor.GRAY + "- Damage Bonus: " + ChatColor.GREEN + 2 + "hp" /*TODO: add player upgrades*/}).build()); } } diff --git a/src/main/java/sugaku/rpg/framework/menus/classes/BardMenu.java b/src/main/java/sugaku/rpg/framework/menus/classes/BardMenu.java index d39ac1b..007bd09 100644 --- a/src/main/java/sugaku/rpg/framework/menus/classes/BardMenu.java +++ b/src/main/java/sugaku/rpg/framework/menus/classes/BardMenu.java @@ -1,11 +1,11 @@ package sugaku.rpg.framework.menus.classes; +import io.github.math0898.rpgframework.items.ItemBuilder; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import sugaku.rpg.framework.classes.Classes; -import sugaku.rpg.framework.items.ItemsManager; import sugaku.rpg.framework.menus.Menu; import sugaku.rpg.framework.players.PlayerManager; @@ -40,43 +40,43 @@ public void build(Inventory inv, Player p) { int level = getClassLvl(Classes.BARD); int xp = getClassXp(Classes.BARD); - inv.setItem(10, ItemsManager.createItem(Material.NOTE_BLOCK, Math.max(1, classPoints), ChatColor.DARK_GREEN + "Class points: " + classPoints, new String[]{ + inv.setItem(10, new ItemBuilder(Material.NOTE_BLOCK, Math.max(1, classPoints), ChatColor.DARK_GREEN + "Class points: " + classPoints).setLore(new String[]{ ChatColor.GRAY + "Spend class points to upgrade", ChatColor.GRAY + "class abilities and passives.", - ChatColor.GRAY + "One point is given per level."})); - inv.setItem(12, ItemsManager.createItem(Material.SUGAR, 1, ChatColor.DARK_AQUA + "Swiftness", new String[]{ + ChatColor.GRAY + "One point is given per level."}).build()); + inv.setItem(12, new ItemBuilder(Material.SUGAR, 1, ChatColor.DARK_AQUA + "Swiftness").setLore(new String[]{ ChatColor.GRAY + "Gain swiftness to outrun your", ChatColor.GRAY + "foes.", ChatColor.GRAY + "Current Stats: ", ChatColor.GRAY + "- Strength: " + ChatColor.GREEN + 1, //TODO: add player upgrades - ChatColor.GRAY + "- Buff Duration: " + ChatColor.GREEN + 45 + "s" /*^^^*/})); - inv.setItem(14, ItemsManager.createItem(Material.GLISTERING_MELON_SLICE, 1, ChatColor.DARK_AQUA + "Regeneration", new String[]{ + ChatColor.GRAY + "- Buff Duration: " + ChatColor.GREEN + 45 + "s" /*^^^*/}).build()); + inv.setItem(14, new ItemBuilder(Material.GLISTERING_MELON_SLICE, 1, ChatColor.DARK_AQUA + "Regeneration").setLore(new String[]{ ChatColor.GRAY + "Heal your wounds with a relaxing", ChatColor.GRAY + "melody.", ChatColor.GRAY + "Current Stats: ", ChatColor.GRAY + "- Strength: " + ChatColor.GREEN + 1, //TODO: add player upgrades - ChatColor.GRAY + "- Buff Duration: " + ChatColor.GREEN + 45 + "s"})); - inv.setItem(16, ItemsManager.createItem(Material.BLAZE_POWDER, 1, ChatColor.DARK_AQUA + "Strength", new String[]{ + ChatColor.GRAY + "- Buff Duration: " + ChatColor.GREEN + 45 + "s"}).build()); + inv.setItem(16, new ItemBuilder(Material.BLAZE_POWDER, 1, ChatColor.DARK_AQUA + "Strength").setLore(new String[]{ ChatColor.GRAY + "Strengthen your bones and muscles", ChatColor.GRAY + "with a grand epic to strike down", ChatColor.GRAY + "your enemies.", ChatColor.GRAY + "Current Stats: ", ChatColor.GRAY + "- Strength: " + ChatColor.GREEN + 1, //TODO: add player upgrades - ChatColor.GRAY + "- Buff Duration: " + ChatColor.GREEN + 45 + "s"})); + ChatColor.GRAY + "- Buff Duration: " + ChatColor.GREEN + 45 + "s"}).build()); if (Objects.requireNonNull(PlayerManager.getPlayer(p.getUniqueId())).getCombatClass() == Classes.BARD) { - inv.setItem(28, ItemsManager.createItem(Material.LAPIS_BLOCK, 1, ChatColor.BLUE + "Lvl: " + level, new String[]{ + inv.setItem(28, new ItemBuilder(Material.LAPIS_BLOCK, 1, ChatColor.BLUE + "Lvl: " + level).setLore(new String[]{ ChatColor.GRAY + "Slay bosses and RPG mobs to", ChatColor.GRAY + "gain xp for your active class.", "", - ChatColor.GRAY + "Xp until next level: " + ChatColor.GREEN + ((level*300) - xp), /*TODO: check that this equation works*/})); + ChatColor.GRAY + "Xp until next level: " + ChatColor.GREEN + ((level*300) - xp), /*TODO: check that this equation works*/}).build()); } else { - inv.setItem(28, ItemsManager.createItem(Material.EMERALD_BLOCK, 1, ChatColor.GREEN + "" + ChatColor.BOLD + "Join the class", new String[]{ + inv.setItem(28, new ItemBuilder(Material.EMERALD_BLOCK, 1, ChatColor.GREEN.toString() + ChatColor.BOLD + "Join the class").setLore(new String[]{ ChatColor.GRAY + "Click me to join the bard", ChatColor.GRAY + "class! You will leave your", - ChatColor.GRAY + "current class."})); + ChatColor.GRAY + "current class."}).build()); } - inv.setItem(31, ItemsManager.createItem(Material.TOTEM_OF_UNDYING, 1, ChatColor.GOLD + "A Life of Music", new String[]{ + inv.setItem(31, new ItemBuilder(Material.TOTEM_OF_UNDYING, 1, ChatColor.GOLD + "A Life of Music").setLore(new String[]{ ChatColor.GRAY + "Through your travels you've practiced", ChatColor.GRAY + "and practiced the musical instrument.", ChatColor.GRAY + "After countless hours you've mastered", @@ -87,13 +87,13 @@ public void build(Inventory inv, Player p) { ChatColor.GRAY + "- Duration: " + ChatColor.GREEN + 10 + "s", //TODO: add player upgrades ChatColor.GRAY + "- Cooldown: " + ChatColor.GREEN + 300 + "s", ChatColor.GRAY + "- Instant Healing: " + ChatColor.GREEN + 10, - ChatColor.GRAY + "- Buffs Bonus: " + ChatColor.GREEN + 1})); - inv.setItem(33, ItemsManager.createItem(Material.IRON_SWORD, 1, ChatColor.LIGHT_PURPLE + "Hym", new String[]{ + ChatColor.GRAY + "- Buffs Bonus: " + ChatColor.GREEN + 1}).build()); + inv.setItem(33, new ItemBuilder(Material.IRON_SWORD, 1, ChatColor.LIGHT_PURPLE + "Hym").setLore(new String[]{ ChatColor.GRAY + "It takes time to play each hym", ChatColor.GRAY + "which gives you and your allies", ChatColor.GRAY + "a buff. Through practice you can", ChatColor.GRAY + "increase the tempo of each hym.", ChatColor.GRAY + "Current Stats: ", - ChatColor.GRAY + "- Buff Cooldown: " + ChatColor.GREEN + 30 + "s" /*TODO: add player upgrades*/})); + ChatColor.GRAY + "- Buff Cooldown: " + ChatColor.GREEN + 30 + "s" /*TODO: add player upgrades*/}).build()); } } diff --git a/src/main/java/sugaku/rpg/framework/menus/classes/BerserkerMenu.java b/src/main/java/sugaku/rpg/framework/menus/classes/BerserkerMenu.java index 7442d16..8669040 100644 --- a/src/main/java/sugaku/rpg/framework/menus/classes/BerserkerMenu.java +++ b/src/main/java/sugaku/rpg/framework/menus/classes/BerserkerMenu.java @@ -1,11 +1,11 @@ package sugaku.rpg.framework.menus.classes; +import io.github.math0898.rpgframework.items.ItemBuilder; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import sugaku.rpg.framework.classes.Classes; -import sugaku.rpg.framework.items.ItemsManager; import sugaku.rpg.framework.menus.Menu; import sugaku.rpg.framework.players.PlayerManager; @@ -18,12 +18,16 @@ public class BerserkerMenu extends ClassSubmenu implements Menu { @Override public void onClick(int clicked, Player player) { - switch(clicked) { - case 49: classMenu(player, "main"); break; + switch (clicked) { + case 49 -> classMenu(player, "main"); + // case 12: classMenu(player, "Haste"); // case 14: classMenu(player, "Rage"); // case 16: classMenu(player, "Brute Strength"); - case 28: Objects.requireNonNull(PlayerManager.getPlayer(player.getUniqueId())).joinClass(Classes.BERSERKER); classMenu(player, "Berserker"); break; + case 28 -> { + Objects.requireNonNull(PlayerManager.getPlayer(player.getUniqueId())).joinClass(Classes.BERSERKER); + classMenu(player, "Berserker"); + } // case 31: classMenu(player, "Indomitable Spirit"); // case 33: classMenu(player, "Towering Form"); } @@ -39,45 +43,45 @@ public void build(Inventory inv, Player p) { int level = getClassLvl(Classes.BERSERKER); int xp = getClassXp(Classes.BERSERKER); - inv.setItem(10, ItemsManager.createItem(Material.ROTTEN_FLESH, Math.max(1, classPoints), ChatColor.DARK_GREEN + "Class points: " + classPoints, new String[]{ + inv.setItem(10, new ItemBuilder(Material.ROTTEN_FLESH, Math.max(1, classPoints), ChatColor.DARK_GREEN + "Class points: " + classPoints).setLore(new String[]{ ChatColor.GRAY + "Spend class points to upgrade", ChatColor.GRAY + "class abilities and passives.", - ChatColor.GRAY + "One point is given per level."})); - inv.setItem(12, ItemsManager.createItem(Material.SUGAR, 1, ChatColor.DARK_AQUA + "Haste", new String[]{ + ChatColor.GRAY + "One point is given per level."}).build()); + inv.setItem(12, new ItemBuilder(Material.SUGAR, 1, ChatColor.DARK_AQUA + "Haste").setLore(new String[]{ ChatColor.GRAY + "Will your legs to run faster to", ChatColor.GRAY + "catch up to fleeing foes.", ChatColor.GRAY + "Current Stats: ", ChatColor.GRAY + "- Strength: " + ChatColor.GREEN + 2, //TODO: add player upgrades ChatColor.GRAY + "- Duration: " + ChatColor.GREEN + 10 + "s", - ChatColor.GRAY + "- Cooldown: 30s"})); - inv.setItem(14, ItemsManager.createItem(Material.BLAZE_POWDER, 1, ChatColor.DARK_AQUA + "Rage", new String[]{ + ChatColor.GRAY + "- Cooldown: 30s"}).build()); + inv.setItem(14, new ItemBuilder(Material.BLAZE_POWDER, 1, ChatColor.DARK_AQUA + "Rage").setLore(new String[]{ ChatColor.GRAY + "Temporarily rage your attacks to", ChatColor.GRAY + "deal significantly more damage.", ChatColor.GRAY + "Current Stats: ", ChatColor.GRAY + "- Strength: " + ChatColor.GREEN + 2, //TODO: add player upgrades ChatColor.GRAY + "- Duration: " + ChatColor.GREEN + 10 + "s", - ChatColor.GRAY + "- Cooldown: 60s"})); - inv.setItem(16, ItemsManager.createItem(Material.IRON_AXE, 1, ChatColor.LIGHT_PURPLE + "Brute Strength", new String[]{ + ChatColor.GRAY + "- Cooldown: 60s"}).build()); + inv.setItem(16, new ItemBuilder(Material.IRON_AXE, 1, ChatColor.LIGHT_PURPLE + "Brute Strength").setLore(new String[]{ ChatColor.GRAY + "Mowing down enemies on the battle", ChatColor.GRAY + "field has trained you well with the", ChatColor.GRAY + "axe. With it you can swing faster", ChatColor.GRAY + "and harder, dealing more damage.", ChatColor.GRAY + "Current Stats: ", - ChatColor.GRAY + "- Damage Bonus: " + ChatColor.GREEN + 2 + "hp"/*TODO: add player upgrades*/})); + ChatColor.GRAY + "- Damage Bonus: " + ChatColor.GREEN + 2 + "hp"/*TODO: add player upgrades*/}).build()); if (Objects.requireNonNull(PlayerManager.getPlayer(p.getUniqueId())).getCombatClass() == Classes.BERSERKER) { - inv.setItem(28, ItemsManager.createItem(Material.LAPIS_BLOCK, 1, ChatColor.BLUE + "Lvl: " + level, new String[]{ + inv.setItem(28, new ItemBuilder(Material.LAPIS_BLOCK, 1, ChatColor.BLUE + "Lvl: " + level).setLore(new String[]{ ChatColor.GRAY + "Slay bosses and RPG mobs to", ChatColor.GRAY + "gain xp for your active class.", "", - ChatColor.GRAY + "Xp until next level: " + ChatColor.GREEN + ((level*300) - xp), /*TODO: check that this equation works*/})); + ChatColor.GRAY + "Xp until next level: " + ChatColor.GREEN + ((level*300) - xp), /*TODO: check that this equation works*/}).build()); } else { - inv.setItem(28, ItemsManager.createItem(Material.EMERALD_BLOCK, 1, ChatColor.GREEN + "" + ChatColor.BOLD + "Join the class", new String[]{ + inv.setItem(28, new ItemBuilder(Material.EMERALD_BLOCK, 1, ChatColor.GREEN.toString() + ChatColor.BOLD + "Join the class").setLore(new String[]{ ChatColor.GRAY + "Click me to join the berserker", ChatColor.GRAY + "class! You will leave your", - ChatColor.GRAY + "current class."})); + ChatColor.GRAY + "current class."}).build()); } - inv.setItem(31, ItemsManager.createItem(Material.TOTEM_OF_UNDYING, 1, ChatColor.GOLD + "Indomitable Spirit", new String[]{ + inv.setItem(31, new ItemBuilder(Material.TOTEM_OF_UNDYING, 1, ChatColor.GOLD + "Indomitable Spirit").setLore(new String[]{ ChatColor.GRAY + "As a berserker near death experiences", ChatColor.GRAY + "are little more than part of the job.", ChatColor.GRAY + "During these times however you still", @@ -88,14 +92,14 @@ public void build(Inventory inv, Player p) { ChatColor.GRAY + "- Duration: " + ChatColor.GREEN + 10 + "s", //TODO: add player upgrades ChatColor.GRAY + "- Cooldown: " + ChatColor.GREEN + 180 + "s", ChatColor.GRAY + "- Strength: " + ChatColor.GREEN + 2, - ChatColor.GRAY + "- Lifesteal: " + ChatColor.GREEN + 10 + "%"})); - inv.setItem(33, ItemsManager.createItem(Material.LEATHER_CHESTPLATE, 1, ChatColor.LIGHT_PURPLE + "Towering Form", new String[]{ + ChatColor.GRAY + "- Lifesteal: " + ChatColor.GREEN + 10 + "%"}).build()); + inv.setItem(33, new ItemBuilder(Material.LEATHER_CHESTPLATE, 1, ChatColor.LIGHT_PURPLE + "Towering Form").setLore(new String[]{ ChatColor.GRAY + "As a berserker smalls hits are", ChatColor.GRAY + "meaningless to your overall well", ChatColor.GRAY + "being and recovering from a fight", ChatColor.GRAY + "quickly was always a must.", ChatColor.GRAY + "Current Stats: ", ChatColor.GRAY + "- Damage Reduction: " + ChatColor.GREEN + 2 + "hp", - ChatColor.GRAY + "- Bonus Regeneration: " + ChatColor.GREEN + 20 + "%"/*TODO: add player upgrades*/})); + ChatColor.GRAY + "- Bonus Regeneration: " + ChatColor.GREEN + 20 + "%"/*TODO: add player upgrades*/}).build()); } } diff --git a/src/main/java/sugaku/rpg/framework/menus/classes/MainMenu.java b/src/main/java/sugaku/rpg/framework/menus/classes/MainMenu.java index 57bcb42..f27ff13 100644 --- a/src/main/java/sugaku/rpg/framework/menus/classes/MainMenu.java +++ b/src/main/java/sugaku/rpg/framework/menus/classes/MainMenu.java @@ -1,11 +1,11 @@ package sugaku.rpg.framework.menus.classes; +import io.github.math0898.rpgframework.items.ItemBuilder; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; -import sugaku.rpg.framework.items.ItemsManager; import sugaku.rpg.framework.menus.Menu; import sugaku.rpg.framework.players.PlayerManager; @@ -20,76 +20,77 @@ public class MainMenu implements Menu { public MainMenu(){} - private static final ItemStack classIndicator = ItemsManager.createItem(Material.ENDER_EYE, 1, title, new String[]{ + private static final ItemStack classIndicator = new ItemBuilder(Material.ENDER_EYE, 1, title).setLore(new String[]{ ChatColor.GRAY + "Welcome to the classes menu!", ChatColor.GRAY + "Left clicking a class or archetype", ChatColor.GRAY + "will show details such as your", - ChatColor.GRAY + "current lvl and class abilities."}); + ChatColor.GRAY + "current lvl and class abilities."}).build(); - private static final ItemStack assassinIndicator = ItemsManager.createItem(Material.GHAST_TEAR, 1, brackets(ChatColor.GOLD + "Assassin"), new String[]{ + private static final ItemStack assassinIndicator = new ItemBuilder(Material.GHAST_TEAR, 1, brackets(ChatColor.GOLD + "Assassin")).setLore(new String[]{ ChatColor.GRAY + "Strike your foes with a " + ChatColor.DARK_AQUA + "poisoned blade", ChatColor.GRAY + "before fading into the shadows with your", ChatColor.GRAY + "master of " + ChatColor.DARK_AQUA + "stealth" + ChatColor.GRAY + ". Even cowering behind", - ChatColor.GRAY + "a shield cannot save your enemies."}); + ChatColor.GRAY + "a shield cannot save your enemies."}).build(); - private static final ItemStack bardIndicator = ItemsManager.createItem(Material.NOTE_BLOCK, 1, brackets(ChatColor.GOLD + "Bard"), new String[]{ + private static final ItemStack bardIndicator = new ItemBuilder(Material.NOTE_BLOCK, 1, brackets(ChatColor.GOLD + "Bard")).setLore(new String[]{ ChatColor.GRAY + "The flexibility of bards as fighters", ChatColor.GRAY + "cannot be understated as they can use", ChatColor.GRAY + "any equipment effectively whilst buffing", - ChatColor.GRAY + "themselves and their allies with " + ChatColor.DARK_AQUA + "hym" + ChatColor.GRAY + "."}); + ChatColor.GRAY + "themselves and their allies with " + ChatColor.DARK_AQUA + "hym" + ChatColor.GRAY + "."}).build(); - private static final ItemStack berserkerIndicator = ItemsManager.createItem(Material.ROTTEN_FLESH, 1, brackets(ChatColor.GOLD + "Berserker"), new String[]{ + private static final ItemStack berserkerIndicator = new ItemBuilder(Material.ROTTEN_FLESH, 1, brackets(ChatColor.GOLD + "Berserker")).setLore(new String[]{ ChatColor.GRAY + "Berserkers are fearsome foes that deal", ChatColor.GRAY + "staggering damage with axes. Lost in the", ChatColor.GRAY + "battle berserkers also take less damage", - ChatColor.GRAY + "than other classes would."}); + ChatColor.GRAY + "than other classes would."}).build(); - private static final ItemStack paladinIndicator = ItemsManager.createItem(Material.GOLDEN_SHOVEL, 1, brackets(ChatColor.GOLD + "Paladin"), new String[]{ + private static final ItemStack paladinIndicator = new ItemBuilder(Material.GOLDEN_SHOVEL, 1, brackets(ChatColor.GOLD + "Paladin")).setLore(new String[]{ ChatColor.GRAY + "Paladins are pure warriors who can " + ChatColor.DARK_AQUA + "purify", ChatColor.GRAY + "themselves and their allies. Healing magic", ChatColor.GRAY + "also comes naturally to paladins resulting", - ChatColor.GRAY + "in higher max health and " + ChatColor.DARK_AQUA + "regeneration" + "."}); + ChatColor.GRAY + "in higher max health and " + ChatColor.DARK_AQUA + "regeneration" + "."}).build(); - private static final ItemStack pyromancerIndicator = ItemsManager.createItem(Material.BLAZE_POWDER, 1, brackets(ChatColor.GOLD + "Pyromancer"), new String[]{ + private static final ItemStack pyromancerIndicator = new ItemBuilder(Material.BLAZE_POWDER, 1, brackets(ChatColor.GOLD + "Pyromancer")).setLore(new String[]{ ChatColor.GRAY + "Burn your enemies with the power of the", ChatColor.GRAY + "phoenix and call upon the " +ChatColor.DARK_AQUA + "renewal" + ChatColor.GRAY + " powers", - ChatColor.GRAY + "to heal yourself and resurrect from the grave."}); + ChatColor.GRAY + "to heal yourself and resurrect from the grave."}).build(); - private static final ItemStack marksmanIndicator = ItemsManager.createItem(Material.BOW, 1, brackets(ChatColor.GOLD + "Marksman"), new String[]{ChatColor.DARK_RED + "Coming soon."}); + private static final ItemStack marksmanIndicator = new ItemBuilder(Material.BOW, 1, brackets(ChatColor.GOLD + "Marksman")).setLore(new String[]{ChatColor.DARK_RED + "Coming soon."}).build(); - private static final ItemStack fighterIndicator = ItemsManager.createItem(Material.IRON_SWORD, 1, brackets(ChatColor.BLUE + "Fighter"), new String[]{ + private static final ItemStack fighterIndicator = new ItemBuilder(Material.IRON_SWORD, 1, brackets(ChatColor.BLUE + "Fighter")).setLore(new String[]{ ChatColor.GRAY + "Through your years of training in combat", ChatColor.GRAY + "you've suffered many injuries and can apply", - ChatColor.GRAY + "basic " + ChatColor.DARK_AQUA + "first aid " + brackets(ChatColor.GOLD + "" + ChatColor.BOLD + "Dev") + ChatColor.GRAY + " using paper."}); + ChatColor.GRAY + "basic " + ChatColor.DARK_AQUA + "first aid " + brackets(ChatColor.GOLD.toString() + ChatColor.BOLD + "Dev") + ChatColor.GRAY + " using paper."}).build(); - private static final ItemStack casterIndicator = ItemsManager.createItem(Material.ENCHANTING_TABLE, 1, brackets(ChatColor.BLUE + "Caster"), new String[]{ + private static final ItemStack casterIndicator = new ItemBuilder(Material.ENCHANTING_TABLE, 1, brackets(ChatColor.BLUE + "Caster")).setLore(new String[]{ ChatColor.GRAY + "Casters have powerful abilities which depend", ChatColor.GRAY + "on the class selected. Through your years", ChatColor.GRAY + "of study in getting these skills your muscles", ChatColor.GRAY + "have grown weaker and you take additional", ChatColor.GRAY + "damage from " + ChatColor.LIGHT_PURPLE + "players" + ChatColor.GRAY + " who are " + ChatColor.BLUE + "fighters" + ChatColor.GRAY + "." - }); + }).build(); - private static final ItemStack adventurerIndicator = ItemsManager.createItem(Material.LEATHER_BOOTS, 1, brackets(ChatColor.DARK_GREEN + "Adventurer"), new String[]{ + private static final ItemStack adventurerIndicator = new ItemBuilder(Material.LEATHER_BOOTS, 1, brackets(ChatColor.DARK_GREEN + "Adventurer")).setLore(new String[]{ ChatColor.GRAY + "By being an adventurer you", ChatColor.GRAY + "gain some general bonuses", - ChatColor.GRAY + "to various drop rates."}); + ChatColor.GRAY + "to various drop rates."}).build(); - private static final ItemStack noneIndicator = ItemsManager.createItem(Material.BARRIER, 1, brackets(ChatColor.RED + "" + ChatColor.BOLD + "None")); + private static final ItemStack noneIndicator = new ItemBuilder(Material.BARRIER, 1, brackets(ChatColor.RED.toString() + ChatColor.BOLD + "None")).build(); @Override public void onClick(int clicked, Player player) { - switch(clicked) { - case 11: classMenu(player, Objects.requireNonNull(PlayerManager.getPlayer(player.getUniqueId())).getCombatClassString()); break; + switch (clicked) { + case 11 -> classMenu(player, Objects.requireNonNull(PlayerManager.getPlayer(player.getUniqueId())).getCombatClassString()); + // case 13: classMenu(player, Objects.requireNonNull(PlayerManager.getPlayer(player.getUniqueId())).getArchetype()); break; // case 15: classMenu(player, "Adventurer"); break; // case 28: classMenu(player, "Fighter"); break; // case 37: classMenu(player, "Caster"); break; - case 30: classMenu(player, "Assassin"); break; - case 31: classMenu(player, "Bard"); break; - case 32: classMenu(player, "Berserker"); break; - case 33: classMenu(player, "Paladin"); break; - case 34: classMenu(player, "Pyromancer"); break; + case 30 -> classMenu(player, "Assassin"); + case 31 -> classMenu(player, "Bard"); + case 32 -> classMenu(player, "Berserker"); + case 33 -> classMenu(player, "Paladin"); + case 34 -> classMenu(player, "Pyromancer"); // case 41: classMenu(player, "Marksman"); break; } } @@ -115,22 +116,22 @@ public void build(Inventory inv, Player p) { } private static ItemStack getClassIndicator(Player p) { - switch(Objects.requireNonNull(PlayerManager.getPlayer(p.getUniqueId())).getCombatClass()) { - case ASSASSIN: return assassinIndicator; - case BARD: return bardIndicator; - case BERSERKER: return berserkerIndicator; - case PALADIN: return paladinIndicator; - case PYROMANCER: return pyromancerIndicator; - case MARKSMEN: return marksmanIndicator; - } - return noneIndicator; + return switch (Objects.requireNonNull(PlayerManager.getPlayer(p.getUniqueId())).getCombatClass()) { + case ASSASSIN -> assassinIndicator; + case BARD -> bardIndicator; + case BERSERKER -> berserkerIndicator; + case PALADIN -> paladinIndicator; + case PYROMANCER -> pyromancerIndicator; + case MARKSMEN -> marksmanIndicator; + default -> noneIndicator; + }; } private static ItemStack getArchIndicator(Player p) { - switch(Objects.requireNonNull(PlayerManager.getPlayer(p.getUniqueId())).getArchetype()) { - case "Fighter": return fighterIndicator; - case "Caster": return casterIndicator; - } - return noneIndicator; + return switch (Objects.requireNonNull(PlayerManager.getPlayer(p.getUniqueId())).getArchetype()) { + case "Fighter" -> fighterIndicator; + case "Caster" -> casterIndicator; + default -> noneIndicator; + }; } } diff --git a/src/main/java/sugaku/rpg/framework/menus/classes/PaladinMenu.java b/src/main/java/sugaku/rpg/framework/menus/classes/PaladinMenu.java index 7aa5676..6ba4e74 100644 --- a/src/main/java/sugaku/rpg/framework/menus/classes/PaladinMenu.java +++ b/src/main/java/sugaku/rpg/framework/menus/classes/PaladinMenu.java @@ -1,11 +1,11 @@ package sugaku.rpg.framework.menus.classes; +import io.github.math0898.rpgframework.items.ItemBuilder; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import sugaku.rpg.framework.classes.Classes; -import sugaku.rpg.framework.items.ItemsManager; import sugaku.rpg.framework.menus.Menu; import sugaku.rpg.framework.players.PlayerManager; @@ -39,19 +39,19 @@ public void build(Inventory inv, Player p) { int level = getClassLvl(Classes.PALADIN); int xp = getClassXp(Classes.PALADIN); - inv.setItem(10, ItemsManager.createItem(Material.GOLDEN_SHOVEL, Math.max(1, classPoints), ChatColor.DARK_GREEN + "Class points: " + classPoints, new String[]{ + inv.setItem(10, new ItemBuilder(Material.GOLDEN_SHOVEL, Math.max(1, classPoints), ChatColor.DARK_GREEN + "Class points: " + classPoints).setLore(new String[]{ ChatColor.GRAY + "Spend class points to upgrade", ChatColor.GRAY + "class abilities and passives.", - ChatColor.GRAY + "One point is given per level."})); - inv.setItem(12, ItemsManager.createItem(Material.GLISTERING_MELON_SLICE, 1, ChatColor.DARK_AQUA + "Mend", new String[]{ + ChatColor.GRAY + "One point is given per level."}).build()); + inv.setItem(12, new ItemBuilder(Material.GLISTERING_MELON_SLICE, 1, ChatColor.DARK_AQUA + "Mend").setLore(new String[]{ ChatColor.GRAY + "Mend your own and your ally's", ChatColor.GRAY + "wounds with your mastery of", ChatColor.GRAY + "healing magic.", ChatColor.GRAY + "Current Stats: ", ChatColor.GRAY + "- Strength: " + ChatColor.GREEN + 3, //TODO: add player upgrades ChatColor.GRAY + "- Duration: " + ChatColor.GREEN + 15 + "s", - ChatColor.GRAY + "- Cooldown: " + ChatColor.GREEN + 30 + "s"})); - inv.setItem(14, ItemsManager.createItem(Material.GLOWSTONE_DUST, 1, ChatColor.DARK_AQUA + "Purify", new String[]{ + ChatColor.GRAY + "- Cooldown: " + ChatColor.GREEN + 30 + "s"}).build()); + inv.setItem(14, new ItemBuilder(Material.GLOWSTONE_DUST, 1, ChatColor.DARK_AQUA + "Purify").setLore(new String[]{ ChatColor.GRAY + "Purify your party from all", ChatColor.GRAY + "ailments, heal a significant", ChatColor.GRAY + "amount, and become damage", @@ -59,28 +59,28 @@ public void build(Inventory inv, Player p) { ChatColor.GRAY + "Current Stats: ", ChatColor.GRAY + "- Strength: " + ChatColor.GREEN + 5, //TODO: add player upgrades ChatColor.GRAY + "- Duration: " + ChatColor.GREEN + 5 + "s", - ChatColor.GRAY + "- Cooldown: " + ChatColor.GREEN + 60 + "s"})); - inv.setItem(16, ItemsManager.createItem(Material.GOLDEN_CHESTPLATE, 1, ChatColor.LIGHT_PURPLE + "Holy Form", new String[]{ + ChatColor.GRAY + "- Cooldown: " + ChatColor.GREEN + 60 + "s"}).build()); + inv.setItem(16, new ItemBuilder(Material.GOLDEN_CHESTPLATE, 1, ChatColor.LIGHT_PURPLE + "Holy Form").setLore(new String[]{ ChatColor.GRAY + "Your mastery of healing magic has", ChatColor.GRAY + "increased your overall vitality", ChatColor.GRAY + "and therefore your maximum health.", ChatColor.GRAY + "Current Stats: ", ChatColor.GRAY + "- Health Bonus: " + ChatColor.GREEN + 10 + "hp"/*TODO: add player upgrades*/, - brackets(ChatColor.RED + "Disabled") + " -" + ChatColor.RED + " Odd functionality"})); + brackets(ChatColor.RED + "Disabled") + " -" + ChatColor.RED + " Odd functionality"}).build()); if (Objects.requireNonNull(PlayerManager.getPlayer(p.getUniqueId())).getCombatClass() == Classes.PALADIN) { - inv.setItem(28, ItemsManager.createItem(Material.LAPIS_BLOCK, 1, ChatColor.BLUE + "Lvl: " + level, new String[]{ + inv.setItem(28, new ItemBuilder(Material.LAPIS_BLOCK, 1, ChatColor.BLUE + "Lvl: " + level).setLore(new String[]{ ChatColor.GRAY + "Slay bosses and RPG mobs to", ChatColor.GRAY + "gain xp for your active class.", "", - ChatColor.GRAY + "Xp until next level: " + ChatColor.GREEN + ((level*300) - xp), /*TODO: check that this equation works*/})); + ChatColor.GRAY + "Xp until next level: " + ChatColor.GREEN + ((level*300) - xp), /*TODO: check that this equation works*/}).build()); } else { - inv.setItem(28, ItemsManager.createItem(Material.EMERALD_BLOCK, 1, ChatColor.GREEN + "" + ChatColor.BOLD + "Join the class", new String[]{ + inv.setItem(28, new ItemBuilder(Material.EMERALD_BLOCK, 1, ChatColor.GREEN.toString() + ChatColor.BOLD + "Join the class").setLore(new String[]{ ChatColor.GRAY + "Click me to join the paladin", ChatColor.GRAY + "class! You will leave your", - ChatColor.GRAY + "current class."})); + ChatColor.GRAY + "current class."}).build()); } - inv.setItem(32, ItemsManager.createItem(Material.TOTEM_OF_UNDYING, 1, ChatColor.GOLD + "Protection of the Healer", new String[]{ + inv.setItem(32, new ItemBuilder(Material.TOTEM_OF_UNDYING, 1, ChatColor.GOLD + "Protection of the Healer").setLore(new String[]{ ChatColor.GRAY + "To prevent death latent healing magic", ChatColor.GRAY + "bursts forth from your body healing", ChatColor.GRAY + "your entire party, increasing their", @@ -90,6 +90,6 @@ public void build(Inventory inv, Player p) { ChatColor.GRAY + "- Duration: " + ChatColor.GREEN + 10 + "s", //TODO: add player upgrades ChatColor.GRAY + "- Cooldown: " + ChatColor.GREEN + 300 + "s", ChatColor.GRAY + "- Instant Heal: " + ChatColor.GREEN + 2, - ChatColor.GRAY + "- Buffs Strength: " + ChatColor.GREEN + 2})); + ChatColor.GRAY + "- Buffs Strength: " + ChatColor.GREEN + 2}).build()); } } diff --git a/src/main/java/sugaku/rpg/framework/menus/classes/PyromancerMenu.java b/src/main/java/sugaku/rpg/framework/menus/classes/PyromancerMenu.java index 4f69303..8adce89 100644 --- a/src/main/java/sugaku/rpg/framework/menus/classes/PyromancerMenu.java +++ b/src/main/java/sugaku/rpg/framework/menus/classes/PyromancerMenu.java @@ -1,11 +1,11 @@ package sugaku.rpg.framework.menus.classes; +import io.github.math0898.rpgframework.items.ItemBuilder; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import sugaku.rpg.framework.classes.Classes; -import sugaku.rpg.framework.items.ItemsManager; import sugaku.rpg.framework.menus.Menu; import sugaku.rpg.framework.players.PlayerManager; @@ -38,18 +38,18 @@ public void build(Inventory inv, Player p) { int level = getClassLvl(Classes.PYROMANCER); int xp = getClassXp(Classes.PYROMANCER); - inv.setItem(10, ItemsManager.createItem(Material.BLAZE_POWDER, Math.max(1, classPoints), ChatColor.DARK_GREEN + "Class points: " + classPoints, new String[]{ + inv.setItem(10, new ItemBuilder(Material.BLAZE_POWDER, Math.max(1, classPoints), ChatColor.DARK_GREEN + "Class points: " + classPoints).setLore(new String[]{ ChatColor.GRAY + "Spend class points to upgrade", ChatColor.GRAY + "class abilities and passives.", - ChatColor.GRAY + "One point is given per level."})); - inv.setItem(12, ItemsManager.createItem(Material.FIRE_CHARGE, 1, ChatColor.DARK_AQUA + "Fireball", new String[]{ + ChatColor.GRAY + "One point is given per level."}).build()); + inv.setItem(12, new ItemBuilder(Material.FIRE_CHARGE, 1, ChatColor.DARK_AQUA + "Fireball").setLore(new String[]{ ChatColor.GRAY + "Fire a fireball, small or large.", ChatColor.GRAY + "Current Stats: ", ChatColor.GRAY + "- Small Strength: " + ChatColor.GREEN + 1, //TODO: add player upgrades ChatColor.GRAY + "- Small Cooldown: " + ChatColor.GREEN + 3 + "s", ChatColor.GRAY + "- Big Strength: " + ChatColor.GREEN + 3, - ChatColor.GRAY + "- Big Cooldown: " + ChatColor.GREEN + 5 + "s"})); - inv.setItem(14, ItemsManager.createItem(Material.BLAZE_ROD, 1, ChatColor.DARK_AQUA + "Fireball Barrage", new String[]{ + ChatColor.GRAY + "- Big Cooldown: " + ChatColor.GREEN + 5 + "s"}).build()); + inv.setItem(14, new ItemBuilder(Material.BLAZE_ROD, 1, ChatColor.DARK_AQUA + "Fireball Barrage").setLore(new String[]{ ChatColor.GRAY + "Fire an onslaught of fireballs.", ChatColor.GRAY + "Uses the strength of a single", ChatColor.GRAY + "fireball attack.", @@ -57,31 +57,31 @@ public void build(Inventory inv, Player p) { ChatColor.GRAY + "- Small Count: " + ChatColor.GREEN + 3, ChatColor.GRAY + "- Small Cooldown: " + ChatColor.GREEN + 10 + "s", //TODO: add player upgrades ChatColor.GRAY + "- Big Count: " + ChatColor.GREEN + 3, - ChatColor.GRAY + "- Big Cooldown: " + ChatColor.GREEN + 15 + "s"})); - inv.setItem(16, ItemsManager.createItem(Material.MAGMA_CREAM, 1, ChatColor.LIGHT_PURPLE + "Bathed in Fire", new String[]{ + ChatColor.GRAY + "- Big Cooldown: " + ChatColor.GREEN + 15 + "s"}).build()); + inv.setItem(16, new ItemBuilder(Material.MAGMA_CREAM, 1, ChatColor.LIGHT_PURPLE + "Bathed in Fire").setLore(new String[]{ ChatColor.GRAY + "Spending soo much time around the", ChatColor.GRAY + "flame you've developed a strong", - ChatColor.GRAY + "resistance to it."})); + ChatColor.GRAY + "resistance to it."}).build()); if (Objects.requireNonNull(PlayerManager.getPlayer(p.getUniqueId())).getCombatClass() == Classes.PYROMANCER) { - inv.setItem(28, ItemsManager.createItem(Material.LAPIS_BLOCK, 1, ChatColor.BLUE + "Lvl: " + level, new String[]{ + inv.setItem(28, new ItemBuilder(Material.LAPIS_BLOCK, 1, ChatColor.BLUE + "Lvl: " + level).setLore(new String[]{ ChatColor.GRAY + "Slay bosses and RPG mobs to", ChatColor.GRAY + "gain xp for your active class.", "", - ChatColor.GRAY + "Xp until next level: " + ChatColor.GREEN + ((level*300) - xp), /*TODO: check that this equation works*/})); + ChatColor.GRAY + "Xp until next level: " + ChatColor.GREEN + ((level*300) - xp), /*TODO: check that this equation works*/}).build()); } else { - inv.setItem(28, ItemsManager.createItem(Material.EMERALD_BLOCK, 1, ChatColor.GREEN + "" + ChatColor.BOLD + "Join the class", new String[]{ + inv.setItem(28, new ItemBuilder(Material.EMERALD_BLOCK, 1, ChatColor.GREEN.toString() + ChatColor.BOLD + "Join the class").setLore(new String[]{ ChatColor.GRAY + "Click me to join the pyromancer", ChatColor.GRAY + "class! You will leave your", - ChatColor.GRAY + "current class."})); + ChatColor.GRAY + "current class."}).build()); } - inv.setItem(32, ItemsManager.createItem(Material.TOTEM_OF_UNDYING, 1, ChatColor.GOLD + "Phoenix Renewal", new String[]{ + inv.setItem(32, new ItemBuilder(Material.TOTEM_OF_UNDYING, 1, ChatColor.GOLD + "Phoenix Renewal").setLore(new String[]{ ChatColor.GRAY + "Call upon the power of the phoenix", ChatColor.GRAY + "to burn your enemies and revitalize", ChatColor.GRAY + "yourself.", ChatColor.GRAY + "Current Stats: ", ChatColor.GRAY + "- Duration: " + ChatColor.GREEN + 15 + "s", //TODO: add player upgrades ChatColor.GRAY + "- Cooldown: " + ChatColor.GREEN + 180 + "s", - ChatColor.GRAY + "- Strength: " + ChatColor.GREEN + 5})); + ChatColor.GRAY + "- Strength: " + ChatColor.GREEN + 5}).build()); } } diff --git a/src/main/java/sugaku/rpg/mobs/teir1/eiryeras/EiryerasBoss.java b/src/main/java/sugaku/rpg/mobs/teir1/eiryeras/EiryerasBoss.java index e6b30b3..f40e450 100644 --- a/src/main/java/sugaku/rpg/mobs/teir1/eiryeras/EiryerasBoss.java +++ b/src/main/java/sugaku/rpg/mobs/teir1/eiryeras/EiryerasBoss.java @@ -1,5 +1,6 @@ package sugaku.rpg.mobs.teir1.eiryeras; +import io.github.math0898.rpgframework.items.ItemBuilder; import org.bukkit.*; import org.bukkit.attribute.Attribute; import org.bukkit.attribute.AttributeModifier; @@ -117,7 +118,7 @@ public void invalidate() { } */ private static final BossDrop[] bossDrops = new BossDrop[]{ //Rare Eiryeras' Bow - new BossDrop(ItemsManager.createItem(Material.BOW, 1, ChatColor.BLUE + "Hand Crafted Bow", new String[]{ + new BossDrop(new ItemBuilder(Material.BOW, 1, ChatColor.BLUE + "Hand Crafted Bow").setLore(new String[]{ ChatColor.GRAY + "A bow crafted by a very", ChatColor.GRAY + "experienced artisan from", ChatColor.BLUE + "Strathenberg" + ChatColor.GRAY + ". The unique", @@ -125,10 +126,10 @@ public void invalidate() { } ChatColor.GRAY + "transfer more energy into", ChatColor.GRAY + "each shot.", ChatColor.BLUE + "Arrow Damage: + 4" - }), Rarity.RARE), + }).build(), Rarity.RARE), //Uncommon Eiryeras' Boots - new BossDrop(ItemsManager.createLeatherArmor(Material.LEATHER_BOOTS, ChatColor.GREEN + "Worn Galoshes", new String[]{ + new BossDrop(new ItemBuilder(Material.LEATHER_BOOTS, ChatColor.GREEN + "Worn Galoshes").setLore(new String[]{ ChatColor.GRAY + "While traveling it is very", ChatColor.GRAY + "important to keep your feet", ChatColor.GRAY + "dry. Failing to do so can", @@ -136,14 +137,14 @@ public void invalidate() { } ChatColor.GRAY + "blisters, and warts. Do", ChatColor.GRAY + "yourself a favor and get a", ChatColor.GRAY + "good pair of footwear." - }, 60, 115, 31, new AttributeModifier[]{ + }).setRGB(60, 115, 31).setModifiers(new AttributeModifier[]{ ItemsManager.attributeModifier(Attribute.GENERIC_ATTACK_DAMAGE, 1.0, EquipmentSlot.FEET), ItemsManager.attributeModifier(Attribute.GENERIC_MAX_HEALTH, 2.0, EquipmentSlot.FEET), // + 1 ItemsManager.attributeModifier(Attribute.GENERIC_ARMOR, 0.5, EquipmentSlot.FEET) // + 0.25 - }), Rarity.UNCOMMON), + }).build(), Rarity.UNCOMMON), //Uncommon Eiryeras' Leggings - new BossDrop(ItemsManager.createLeatherArmor(Material.LEATHER_LEGGINGS, ChatColor.GREEN + "Hide Leggings", new String[]{ + new BossDrop(new ItemBuilder(Material.LEATHER_LEGGINGS, ChatColor.GREEN + "Hide Leggings").setLore(new String[]{ ChatColor.GRAY + "Woods which do not reside in", ChatColor.GRAY + "floodplains often cultivate", ChatColor.GRAY + "a large amount of undergrowth", @@ -151,14 +152,14 @@ public void invalidate() { } ChatColor.GRAY + "difficult to move through.", ChatColor.GRAY + "A good pair of protective", ChatColor.GRAY + "pants is a good idea." - }, 93, 161, 124, new AttributeModifier[]{ + }).setRGB(93, 161, 124).setModifiers(new AttributeModifier[]{ ItemsManager.attributeModifier(Attribute.GENERIC_ATTACK_DAMAGE, 1.0, EquipmentSlot.LEGS), ItemsManager.attributeModifier(Attribute.GENERIC_MAX_HEALTH, 3.0, EquipmentSlot.LEGS), // + 1 ItemsManager.attributeModifier(Attribute.GENERIC_ARMOR, 0.75, EquipmentSlot.LEGS) // + 0.25 - }), Rarity.UNCOMMON), + }).build(), Rarity.UNCOMMON), //Uncommon Eiryeras' Chestplate - new BossDrop(ItemsManager.createLeatherArmor(Material.LEATHER_CHESTPLATE, ChatColor.GREEN + "Hunter's Cloak", new String[]{ + new BossDrop(new ItemBuilder(Material.LEATHER_CHESTPLATE, ChatColor.GREEN + "Hunter's Cloak").setLore(new String[]{ ChatColor.GRAY + "Similar to hoods, cloaks help", ChatColor.GRAY + "greatly to reduce environmental", ChatColor.GRAY + "hazards as well as recolor the", @@ -166,37 +167,37 @@ public void invalidate() { } ChatColor.GRAY + "This particular cloak is", ChatColor.GRAY + "specifically colored for the", ChatColor.GRAY + "forests of Agloytan." - }, 113, 172, 11, new AttributeModifier[]{ + }).setRGB(113, 172, 11).setModifiers(new AttributeModifier[]{ ItemsManager.attributeModifier(Attribute.GENERIC_ATTACK_DAMAGE, 1.0, EquipmentSlot.CHEST), ItemsManager.attributeModifier(Attribute.GENERIC_MAX_HEALTH, 4.0, EquipmentSlot.CHEST), // + 1 ItemsManager.attributeModifier(Attribute.GENERIC_ARMOR, 1, EquipmentSlot.CHEST) // + 0.25 - }), Rarity.UNCOMMON), + }).build(), Rarity.UNCOMMON), //Uncommon Eiryeras' Helmet - new BossDrop(ItemsManager.createLeatherArmor(Material.LEATHER_HELMET, ChatColor.GREEN + "Hunter's Hood", new String[]{ + new BossDrop(new ItemBuilder(Material.LEATHER_HELMET, ChatColor.GREEN + "Hunter's Hood").setLore(new String[]{ ChatColor.GRAY + "Hoods serve to help to conceal", ChatColor.GRAY + "humanoid features among the", ChatColor.GRAY + "trees as well as protect the", ChatColor.GRAY + "wearer against most", ChatColor.GRAY + "environmental hazards." - }, 60, 115, 31, new AttributeModifier[]{ + }).setRGB(60, 115, 31).setModifiers(new AttributeModifier[]{ ItemsManager.attributeModifier(Attribute.GENERIC_ATTACK_DAMAGE, 1.0, EquipmentSlot.HEAD), ItemsManager.attributeModifier(Attribute.GENERIC_MAX_HEALTH, 2.0, EquipmentSlot.HEAD), // + 1 ItemsManager.attributeModifier(Attribute.GENERIC_ARMOR, 0.5, EquipmentSlot.HEAD) // + 0.25 - }), Rarity.UNCOMMON), + }).build(), Rarity.UNCOMMON), //Rare Eiryeras' Knife - new BossDrop(ItemsManager.createItem(Material.IRON_SWORD,1, ChatColor.BLUE + "Ceremonial Knife", new String[]{ + new BossDrop(new ItemBuilder(Material.IRON_SWORD,1, ChatColor.BLUE + "Ceremonial Knife").setLore(new String[]{ ChatColor.GRAY + "This is a ceremonial knife used", ChatColor.GRAY + "by followers of" + ChatColor.RED +" Inos" + ChatColor.GRAY + "," + ChatColor.RED + " God of", ChatColor.RED + "Spring" + ChatColor.GRAY + ". The blade is used when", ChatColor.GRAY + "gathering natural resources to", ChatColor.GRAY + "show thanks and to humbly ask", ChatColor.GRAY + "for its rejuvenation." - }, new AttributeModifier[]{ItemsManager.attributeModifier(Attribute.GENERIC_ATTACK_DAMAGE, 10.0, EquipmentSlot.HAND)/* + 2.0*/}), Rarity.RARE), + }).setModifiers(new AttributeModifier[]{ItemsManager.attributeModifier(Attribute.GENERIC_ATTACK_DAMAGE, 10.0, EquipmentSlot.HAND)/* + 2.0*/}).build(), Rarity.RARE), //Legendary Eiryeras' Lore - new BossDrop(ItemsManager.createItem(Material.IRON_SWORD,1, ChatColor.GOLD + "Eiryeras Lore", new String[]{ + new BossDrop(new ItemBuilder(Material.IRON_SWORD,1, ChatColor.GOLD + "Eiryeras Lore").setLore(new String[]{ ChatColor.GREEN + "Eiryeras" + ChatColor.GRAY + " from a young age has", ChatColor.GRAY + "always been very chaotic. Rather", ChatColor.GRAY + "than study" + ChatColor.GREEN + " Eiryeras" + ChatColor.GRAY + " would much", @@ -206,16 +207,16 @@ public void invalidate() { } ChatColor.GRAY + "proclaim that the company of", ChatColor.GRAY + "animals is far superior to that", ChatColor.GRAY + "of man." - }), Rarity.LEGENDARY) + }).build(), Rarity.LEGENDARY) }; /** * The hunter's knife Eiryeras uses to charge down enemies and deal the finishing blow. */ - private static final ItemStack huntersKnife = ItemsManager.createItem(IRON_SWORD, 1, " ", new String[]{}, new AttributeModifier[]{ + private static final ItemStack huntersKnife = new ItemBuilder(IRON_SWORD).setModifiers(new AttributeModifier[]{ ItemsManager.attributeModifier(Attribute.GENERIC_ATTACK_DAMAGE, meleeDamage, EquipmentSlot.HAND), ItemsManager.attributeModifier(Attribute.GENERIC_MOVEMENT_SPEED, bonusMoveSpeed, EquipmentSlot.HAND) - }); + }).build(); /** * Creates an Eiryeras boss for reference purposes. @@ -232,10 +233,10 @@ public EiryerasBoss() { */ public EiryerasBoss(Location l) { super(name, EntityType.SKELETON, Rarity.UNCOMMON, 150); - setArmor(ItemsManager.createLeatherArmor(Material.LEATHER_HELMET, " ", new String[]{}, 60, 115, 31), - ItemsManager.createLeatherArmor(Material.LEATHER_CHESTPLATE, " ", new String[]{}, 113, 172, 11), - ItemsManager.createLeatherArmor(Material.LEATHER_LEGGINGS, " ", new String[]{}, 93, 161, 124), - ItemsManager.createLeatherArmor(Material.LEATHER_BOOTS, " ", new String[]{}, 60, 115, 31)); + setArmor(new ItemBuilder(Material.LEATHER_HELMET).setRGB(60, 115, 31).build(), + new ItemBuilder(Material.LEATHER_CHESTPLATE).setRGB(113, 172, 11).build(), + new ItemBuilder(Material.LEATHER_LEGGINGS).setRGB(93, 161, 124).build(), + new ItemBuilder(Material.LEATHER_BOOTS).setRGB(60, 115, 31).build()); setHand(new ItemStack(Material.BOW, 1)); spawn(l); } @@ -276,10 +277,10 @@ public static Collection getBossItems() { @EventHandler public void onShot(EntityShootBowEvent event) { if (event.getEntity().getCustomName() != null) if (event.getEntity().getCustomName().contains(name)) { - switch(determineShot(event.getEntity())) { - case SLOWNESS: event.getProjectile().setMetadata("eiryeras", new arrowType(main.plugin, Arrows.SLOWNESS)); break; - case POISON: event.getProjectile().setMetadata("eiryeras", new arrowType(main.plugin, Arrows.POISON)); break; - case KNOCKBACK: event.getProjectile().setMetadata("eiryeras", new arrowType(main.plugin, Arrows.KNOCKBACK)); break; + switch (determineShot(event.getEntity())) { + case SLOWNESS -> event.getProjectile().setMetadata("eiryeras", new arrowType(main.plugin, Arrows.SLOWNESS)); + case POISON -> event.getProjectile().setMetadata("eiryeras", new arrowType(main.plugin, Arrows.POISON)); + case KNOCKBACK -> event.getProjectile().setMetadata("eiryeras", new arrowType(main.plugin, Arrows.KNOCKBACK)); } for (Entity e: event.getEntity().getNearbyEntities(25, 25, 25)) { if (e instanceof Player) if (((Player) e).getPotionEffect(PotionEffectType.POISON) != null @@ -300,22 +301,19 @@ public void onShot(EntityShootBowEvent event) { */ @EventHandler(priority = EventPriority.HIGHEST) public static void onArrowHit(EntityDamageByEntityEvent e) { - if (e.getEntity() instanceof Player && e.getDamager() instanceof Arrow) { - Arrow a = (Arrow) e.getDamager(); + if (e.getEntity() instanceof Player && e.getDamager() instanceof Arrow a) { if (a.hasMetadata("eiryeras")) { - switch((Arrows) Objects.requireNonNull(a.getMetadata("eiryeras").get(0).value())) { - case SLOWNESS: + switch ((Arrows) Objects.requireNonNull(a.getMetadata("eiryeras").get(0).value())) { + case SLOWNESS -> { e.setDamage(slownessDamage); - ((Player) e.getEntity()).addPotionEffect(new PotionEffect(PotionEffectType.SLOW, 5*20, 0, true)); - break; - case POISON: + ((Player) e.getEntity()).addPotionEffect(new PotionEffect(PotionEffectType.SLOW, 5 * 20, 0, true)); + } + case POISON -> { e.setDamage(poisonDamage); - ((Player) e.getEntity()).addPotionEffect(new PotionEffect(PotionEffectType.POISON, 8*20, 0, true)); - ((Player) e.getEntity()).addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, 2*20, 0, true)); - break; - case KNOCKBACK: - e.setDamage(knockbackDamage); - break; + ((Player) e.getEntity()).addPotionEffect(new PotionEffect(PotionEffectType.POISON, 8 * 20, 0, true)); + ((Player) e.getEntity()).addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, 2 * 20, 0, true)); + } + case KNOCKBACK -> e.setDamage(knockbackDamage); } } } diff --git a/src/main/java/sugaku/rpg/mobs/teir1/feyrith/FeyrithBoss.java b/src/main/java/sugaku/rpg/mobs/teir1/feyrith/FeyrithBoss.java index e49c53c..ba3def8 100644 --- a/src/main/java/sugaku/rpg/mobs/teir1/feyrith/FeyrithBoss.java +++ b/src/main/java/sugaku/rpg/mobs/teir1/feyrith/FeyrithBoss.java @@ -1,5 +1,6 @@ package sugaku.rpg.mobs.teir1.feyrith; +import io.github.math0898.rpgframework.items.ItemBuilder; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; @@ -17,7 +18,7 @@ import org.bukkit.projectiles.ProjectileSource; import org.bukkit.util.BoundingBox; import org.bukkit.util.Vector; -import sugaku.rpg.framework.items.ItemsManager; +import org.jetbrains.annotations.NotNull; import sugaku.rpg.framework.items.Rarity; import sugaku.rpg.main; import sugaku.rpg.mobs.CustomMob; @@ -65,7 +66,7 @@ static class FeyrithMeta implements MetadataValue { public boolean asBoolean() { return false; } @Override - public String asString() { return value + ""; } + public @NotNull String asString() { return String.valueOf(value); } @Override public Plugin getOwningPlugin() { return main.plugin; } @@ -105,9 +106,9 @@ public FeyrithBoss(Location l) { super(name, EntityType.WITHER_SKELETON, Rarity.RARE, maxHealth); setArmor(new ItemStack(Material.AIR, 0), - ItemsManager.createLeatherArmor(Material.LEATHER_CHESTPLATE, " ", new String[]{}, 25, 64, 255), - ItemsManager.createLeatherArmor(Material.LEATHER_LEGGINGS, " ", new String[]{}, 148, 161, 227), - ItemsManager.createLeatherArmor(Material.LEATHER_BOOTS, " ", new String[]{}, 22, 44, 156)); + new ItemBuilder(Material.LEATHER_CHESTPLATE).setRGB(25, 64, 255).build(), + new ItemBuilder(Material.LEATHER_LEGGINGS).setRGB(148, 161, 227).build(), + new ItemBuilder(Material.LEATHER_BOOTS).setRGB(22, 44, 156).build()); spawn(l); getEntity().setGravity(false); getEntity().setVelocity(new Vector(0, 0, 0)); @@ -216,9 +217,9 @@ private void dyeArmor(int r, int g, int b, double c, double l, double f) { LivingEntity entity = getEntity(); EntityEquipment equipment = entity.getEquipment(); assert equipment != null; - equipment.setChestplate(ItemsManager.createLeatherArmor(Material.LEATHER_CHESTPLATE, " ", new String[]{}, (int) (r * c), (int) (g * c), (int) (b * c))); - equipment.setLeggings(ItemsManager.createLeatherArmor(Material.LEATHER_LEGGINGS, " ", new String[]{}, (int) (r * l), (int) (g * l), (int) (b * l))); - equipment.setBoots(ItemsManager.createLeatherArmor(Material.LEATHER_BOOTS, " ", new String[]{}, (int) (r * f), (int) (g * f), (int) (b * f))); + equipment.setChestplate(new ItemBuilder(Material.LEATHER_CHESTPLATE).setRGB((int) (r * c), (int) (g * c), (int) (b * c)).build()); + equipment.setLeggings(new ItemBuilder(Material.LEATHER_LEGGINGS).setRGB((int) (r * l), (int) (g * l), (int) (b * l)).build()); + equipment.setBoots(new ItemBuilder(Material.LEATHER_BOOTS).setRGB((int) (r * f), (int) (g * f), (int) (b * f)).build()); } /** From ef3e705ed30b461461bff6476e62f706171f07c3 Mon Sep 17 00:00:00 2001 From: math0898 <25396616+math0898@users.noreply.github.com> Date: Sat, 29 Apr 2023 22:12:40 -0500 Subject: [PATCH 5/9] Eiryeras Fixes and Tweaks - Removed dropping items on deaths to normal mobs. - Fixed Eiryeras drops not being unbreakable. - Eiryeras now does a melee attack when someone is within 4 blocks. Knockback arrow now significantly less likely. --- .../rpg/framework/players/PlayerManager.java | 2 +- .../rpg/mobs/teir1/eiryeras/EiryerasBoss.java | 23 +++++++++++-------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/main/java/sugaku/rpg/framework/players/PlayerManager.java b/src/main/java/sugaku/rpg/framework/players/PlayerManager.java index 84a3849..f50f954 100644 --- a/src/main/java/sugaku/rpg/framework/players/PlayerManager.java +++ b/src/main/java/sugaku/rpg/framework/players/PlayerManager.java @@ -168,7 +168,7 @@ public static void onDamage(EntityDamageByEntityEvent event) { if (attacker instanceof Player) deathMessage = getPlayerRarity(player) + player.getName() + ChatColor.GRAY + deathFlavor[Math.abs(new Random().nextInt() % deathFlavor.length)] + attacker.getName(); else if (!attacker.isCustomNameVisible()) { deathMessage = getPlayerRarity(player) + player.getName() + ChatColor.GRAY + deathFlavor[Math.abs(new Random().nextInt() % deathFlavor.length)] + "a " + attacker.getName(); - RpgPlayer.dropAll(player); +// RpgPlayer.dropAll(player); player.setExp(player.getExp()/2); player.setLevel(player.getLevel()/2); } else { diff --git a/src/main/java/sugaku/rpg/mobs/teir1/eiryeras/EiryerasBoss.java b/src/main/java/sugaku/rpg/mobs/teir1/eiryeras/EiryerasBoss.java index f40e450..f274a6b 100644 --- a/src/main/java/sugaku/rpg/mobs/teir1/eiryeras/EiryerasBoss.java +++ b/src/main/java/sugaku/rpg/mobs/teir1/eiryeras/EiryerasBoss.java @@ -126,7 +126,7 @@ public void invalidate() { } ChatColor.GRAY + "transfer more energy into", ChatColor.GRAY + "each shot.", ChatColor.BLUE + "Arrow Damage: + 4" - }).build(), Rarity.RARE), + }).setUnbreakable(true).build(), Rarity.RARE), //Uncommon Eiryeras' Boots new BossDrop(new ItemBuilder(Material.LEATHER_BOOTS, ChatColor.GREEN + "Worn Galoshes").setLore(new String[]{ @@ -141,7 +141,7 @@ public void invalidate() { } ItemsManager.attributeModifier(Attribute.GENERIC_ATTACK_DAMAGE, 1.0, EquipmentSlot.FEET), ItemsManager.attributeModifier(Attribute.GENERIC_MAX_HEALTH, 2.0, EquipmentSlot.FEET), // + 1 ItemsManager.attributeModifier(Attribute.GENERIC_ARMOR, 0.5, EquipmentSlot.FEET) // + 0.25 - }).build(), Rarity.UNCOMMON), + }).setUnbreakable(true).build(), Rarity.UNCOMMON), //Uncommon Eiryeras' Leggings new BossDrop(new ItemBuilder(Material.LEATHER_LEGGINGS, ChatColor.GREEN + "Hide Leggings").setLore(new String[]{ @@ -156,7 +156,7 @@ public void invalidate() { } ItemsManager.attributeModifier(Attribute.GENERIC_ATTACK_DAMAGE, 1.0, EquipmentSlot.LEGS), ItemsManager.attributeModifier(Attribute.GENERIC_MAX_HEALTH, 3.0, EquipmentSlot.LEGS), // + 1 ItemsManager.attributeModifier(Attribute.GENERIC_ARMOR, 0.75, EquipmentSlot.LEGS) // + 0.25 - }).build(), Rarity.UNCOMMON), + }).setUnbreakable(true).build(), Rarity.UNCOMMON), //Uncommon Eiryeras' Chestplate new BossDrop(new ItemBuilder(Material.LEATHER_CHESTPLATE, ChatColor.GREEN + "Hunter's Cloak").setLore(new String[]{ @@ -171,7 +171,7 @@ public void invalidate() { } ItemsManager.attributeModifier(Attribute.GENERIC_ATTACK_DAMAGE, 1.0, EquipmentSlot.CHEST), ItemsManager.attributeModifier(Attribute.GENERIC_MAX_HEALTH, 4.0, EquipmentSlot.CHEST), // + 1 ItemsManager.attributeModifier(Attribute.GENERIC_ARMOR, 1, EquipmentSlot.CHEST) // + 0.25 - }).build(), Rarity.UNCOMMON), + }).setUnbreakable(true).build(), Rarity.UNCOMMON), //Uncommon Eiryeras' Helmet new BossDrop(new ItemBuilder(Material.LEATHER_HELMET, ChatColor.GREEN + "Hunter's Hood").setLore(new String[]{ @@ -184,7 +184,7 @@ public void invalidate() { } ItemsManager.attributeModifier(Attribute.GENERIC_ATTACK_DAMAGE, 1.0, EquipmentSlot.HEAD), ItemsManager.attributeModifier(Attribute.GENERIC_MAX_HEALTH, 2.0, EquipmentSlot.HEAD), // + 1 ItemsManager.attributeModifier(Attribute.GENERIC_ARMOR, 0.5, EquipmentSlot.HEAD) // + 0.25 - }).build(), Rarity.UNCOMMON), + }).setUnbreakable(true).build(), Rarity.UNCOMMON), //Rare Eiryeras' Knife new BossDrop(new ItemBuilder(Material.IRON_SWORD,1, ChatColor.BLUE + "Ceremonial Knife").setLore(new String[]{ @@ -194,7 +194,7 @@ public void invalidate() { } ChatColor.GRAY + "gathering natural resources to", ChatColor.GRAY + "show thanks and to humbly ask", ChatColor.GRAY + "for its rejuvenation." - }).setModifiers(new AttributeModifier[]{ItemsManager.attributeModifier(Attribute.GENERIC_ATTACK_DAMAGE, 10.0, EquipmentSlot.HAND)/* + 2.0*/}).build(), Rarity.RARE), + }).setModifiers(new AttributeModifier[]{ItemsManager.attributeModifier(Attribute.GENERIC_ATTACK_DAMAGE, 10.0, EquipmentSlot.HAND)/* + 2.0*/}).setUnbreakable(true).build(), Rarity.RARE), //Legendary Eiryeras' Lore new BossDrop(new ItemBuilder(Material.IRON_SWORD,1, ChatColor.GOLD + "Eiryeras Lore").setLore(new String[]{ @@ -207,7 +207,7 @@ public void invalidate() { } ChatColor.GRAY + "proclaim that the company of", ChatColor.GRAY + "animals is far superior to that", ChatColor.GRAY + "of man." - }).build(), Rarity.LEGENDARY) + }).setUnbreakable(true).build(), Rarity.LEGENDARY) }; /** @@ -290,6 +290,10 @@ public void onShot(EntityShootBowEvent event) { break; } } + if (event.getEntity().getNearbyEntities(4, 4, 4).size() > 0) { + switchToSword(event.getEntity()); + Bukkit.getScheduler().runTaskLater(main.plugin, () -> switchToBow(event.getEntity()), 60); + } } } @@ -371,7 +375,7 @@ private void switchToBow(LivingEntity e) { * @param e The entity, presumably an instance of Eiryeras, which the logic is being determined for. * @return The arrow to be fired. */ - private Arrows determineShot(LivingEntity e) { + private Arrows determineShot (LivingEntity e) { int roll = new Random().nextInt(); @@ -379,8 +383,7 @@ private Arrows determineShot(LivingEntity e) { else if (roll % 11 == 0) return Arrows.SLOWNESS; else if (roll % 10 == 0) return Arrows.KNOCKBACK; - if (e.getNearbyEntities(10.0, 10.0, 10.0).size() > 1) return Arrows.KNOCKBACK; - else if (new Random().nextInt() % 2 == 0) return Arrows.POISON; + if (new Random().nextInt() % 2 == 0) return Arrows.POISON; else return Arrows.SLOWNESS; } } From 32f9b2648c40e530746ae81848e742bae6d8884c Mon Sep 17 00:00:00 2001 From: math0898 <25396616+math0898@users.noreply.github.com> Date: Sat, 29 Apr 2023 22:38:19 -0500 Subject: [PATCH 6/9] Greatly Reduced Code Duplication --- .../framework/menus/classes/AssassinMenu.java | 23 +++++------- .../rpg/framework/menus/classes/BardMenu.java | 31 ++++++++-------- .../menus/classes/BerserkerMenu.java | 23 +++++------- .../framework/menus/classes/ClassSubmenu.java | 37 ++++++++++++++++++- .../framework/menus/classes/PaladinMenu.java | 31 ++++++++-------- .../menus/classes/PyromancerMenu.java | 31 ++++++++-------- 6 files changed, 100 insertions(+), 76 deletions(-) diff --git a/src/main/java/sugaku/rpg/framework/menus/classes/AssassinMenu.java b/src/main/java/sugaku/rpg/framework/menus/classes/AssassinMenu.java index 1116bbc..86d6a3a 100644 --- a/src/main/java/sugaku/rpg/framework/menus/classes/AssassinMenu.java +++ b/src/main/java/sugaku/rpg/framework/menus/classes/AssassinMenu.java @@ -16,7 +16,12 @@ public class AssassinMenu extends ClassSubmenu implements Menu { - public AssassinMenu(){} + /** + * Creates a new class submenu with the given assassin name and enum value. + */ + public AssassinMenu () { + super("assassin", Classes.ASSASSIN); + } @Override public void onClick(int clicked, Player player) { @@ -41,8 +46,6 @@ public void build(Inventory inv, Player p) { inv.setItem(49, goBack); int classPoints = getClassPoints(Classes.ASSASSIN); - int level = getClassLvl(Classes.ASSASSIN); - int xp = getClassXp(Classes.ASSASSIN); inv.setItem(10, new ItemBuilder(Material.GHAST_TEAR, Math.max(1, classPoints), ChatColor.DARK_GREEN + "Class points: " + classPoints).setLore(new String[]{ ChatColor.GRAY + "Spend class points to upgrade", @@ -70,17 +73,9 @@ public void build(Inventory inv, Player p) { ChatColor.GRAY + "- Evasion: " + ChatColor.GREEN + 10 + "%", //TODO: add player upgrades ChatColor.GRAY + "- Swiftness: " + ChatColor.GREEN + 1}).build()); - if (Objects.requireNonNull(PlayerManager.getPlayer(p.getUniqueId())).getCombatClass() == Classes.ASSASSIN) { - inv.setItem(28, new ItemBuilder(Material.LAPIS_BLOCK, 1, ChatColor.BLUE + "Lvl: " + level).setLore(new String[]{ - ChatColor.GRAY + "Slay bosses and RPG mobs to", - ChatColor.GRAY + "gain xp for your active class.", "", - ChatColor.GRAY + "Xp until next level: " + ChatColor.GREEN + ((level*300) - xp), /*TODO: check that this equation works*/}).build()); - } else { - inv.setItem(28, new ItemBuilder(Material.EMERALD_BLOCK, 1, ChatColor.GREEN.toString() + ChatColor.BOLD + "Join the class").setLore(new String[]{ - ChatColor.GRAY + "Click me to join the assassin", - ChatColor.GRAY + "class! You will leave your", - ChatColor.GRAY + "current class."}).build()); - } + if (Objects.requireNonNull(PlayerManager.getPlayer(p.getUniqueId())).getCombatClass() == Classes.ASSASSIN) inv.setItem(28, classLvl); + else inv.setItem(28, joinClass); + inv.setItem(31, new ItemBuilder(Material.TOTEM_OF_UNDYING, 1, ChatColor.GOLD + "Heroic Dodge").setLore(new String[]{ ChatColor.GRAY + "Pulling off an incredible feat", ChatColor.GRAY + "to evade death, you are given", diff --git a/src/main/java/sugaku/rpg/framework/menus/classes/BardMenu.java b/src/main/java/sugaku/rpg/framework/menus/classes/BardMenu.java index 007bd09..71fbb7f 100644 --- a/src/main/java/sugaku/rpg/framework/menus/classes/BardMenu.java +++ b/src/main/java/sugaku/rpg/framework/menus/classes/BardMenu.java @@ -17,14 +17,24 @@ public class BardMenu extends ClassSubmenu implements Menu { + /** + * Creates a new class submenu with the given bard name and enum value. + */ + public BardMenu () { + super("bard", Classes.BARD); + } + @Override public void onClick(int clicked, Player player) { - switch(clicked) { - case 49: classMenu(player, "main"); break; + switch (clicked) { + case 49 -> classMenu(player, "main"); // case 12: classMenu(player, "Swiftness"); // case 14: classMenu(player, "Regeneration"); // case 16: classMenu(player, "Strength"); - case 28: Objects.requireNonNull(PlayerManager.getPlayer(player.getUniqueId())).joinClass(Classes.BARD); classMenu(player, "Bard"); break; + case 28 -> { + Objects.requireNonNull(PlayerManager.getPlayer(player.getUniqueId())).joinClass(Classes.BARD); + classMenu(player, "Bard"); + } // case 31: classMenu(player, "A Life of Music"); // case 33: classMenu(player, "Hym"); } @@ -37,8 +47,6 @@ public void build(Inventory inv, Player p) { inv.setItem(49, goBack); int classPoints = getClassPoints(Classes.BARD); - int level = getClassLvl(Classes.BARD); - int xp = getClassXp(Classes.BARD); inv.setItem(10, new ItemBuilder(Material.NOTE_BLOCK, Math.max(1, classPoints), ChatColor.DARK_GREEN + "Class points: " + classPoints).setLore(new String[]{ ChatColor.GRAY + "Spend class points to upgrade", @@ -64,17 +72,8 @@ public void build(Inventory inv, Player p) { ChatColor.GRAY + "- Strength: " + ChatColor.GREEN + 1, //TODO: add player upgrades ChatColor.GRAY + "- Buff Duration: " + ChatColor.GREEN + 45 + "s"}).build()); - if (Objects.requireNonNull(PlayerManager.getPlayer(p.getUniqueId())).getCombatClass() == Classes.BARD) { - inv.setItem(28, new ItemBuilder(Material.LAPIS_BLOCK, 1, ChatColor.BLUE + "Lvl: " + level).setLore(new String[]{ - ChatColor.GRAY + "Slay bosses and RPG mobs to", - ChatColor.GRAY + "gain xp for your active class.", "", - ChatColor.GRAY + "Xp until next level: " + ChatColor.GREEN + ((level*300) - xp), /*TODO: check that this equation works*/}).build()); - } else { - inv.setItem(28, new ItemBuilder(Material.EMERALD_BLOCK, 1, ChatColor.GREEN.toString() + ChatColor.BOLD + "Join the class").setLore(new String[]{ - ChatColor.GRAY + "Click me to join the bard", - ChatColor.GRAY + "class! You will leave your", - ChatColor.GRAY + "current class."}).build()); - } + if (Objects.requireNonNull(PlayerManager.getPlayer(p.getUniqueId())).getCombatClass() == Classes.BARD) inv.setItem(28, classLvl); + else inv.setItem(28, joinClass); inv.setItem(31, new ItemBuilder(Material.TOTEM_OF_UNDYING, 1, ChatColor.GOLD + "A Life of Music").setLore(new String[]{ ChatColor.GRAY + "Through your travels you've practiced", diff --git a/src/main/java/sugaku/rpg/framework/menus/classes/BerserkerMenu.java b/src/main/java/sugaku/rpg/framework/menus/classes/BerserkerMenu.java index 8669040..7852ecb 100644 --- a/src/main/java/sugaku/rpg/framework/menus/classes/BerserkerMenu.java +++ b/src/main/java/sugaku/rpg/framework/menus/classes/BerserkerMenu.java @@ -16,6 +16,13 @@ public class BerserkerMenu extends ClassSubmenu implements Menu { + /** + * Creates a new class submenu with the berserker name. + */ + public BerserkerMenu () { + super("berserker", Classes.BERSERKER); + } + @Override public void onClick(int clicked, Player player) { switch (clicked) { @@ -40,8 +47,6 @@ public void build(Inventory inv, Player p) { inv.setItem(49, goBack); int classPoints = getClassPoints(Classes.BERSERKER); - int level = getClassLvl(Classes.BERSERKER); - int xp = getClassXp(Classes.BERSERKER); inv.setItem(10, new ItemBuilder(Material.ROTTEN_FLESH, Math.max(1, classPoints), ChatColor.DARK_GREEN + "Class points: " + classPoints).setLore(new String[]{ ChatColor.GRAY + "Spend class points to upgrade", @@ -69,17 +74,9 @@ public void build(Inventory inv, Player p) { ChatColor.GRAY + "Current Stats: ", ChatColor.GRAY + "- Damage Bonus: " + ChatColor.GREEN + 2 + "hp"/*TODO: add player upgrades*/}).build()); - if (Objects.requireNonNull(PlayerManager.getPlayer(p.getUniqueId())).getCombatClass() == Classes.BERSERKER) { - inv.setItem(28, new ItemBuilder(Material.LAPIS_BLOCK, 1, ChatColor.BLUE + "Lvl: " + level).setLore(new String[]{ - ChatColor.GRAY + "Slay bosses and RPG mobs to", - ChatColor.GRAY + "gain xp for your active class.", "", - ChatColor.GRAY + "Xp until next level: " + ChatColor.GREEN + ((level*300) - xp), /*TODO: check that this equation works*/}).build()); - } else { - inv.setItem(28, new ItemBuilder(Material.EMERALD_BLOCK, 1, ChatColor.GREEN.toString() + ChatColor.BOLD + "Join the class").setLore(new String[]{ - ChatColor.GRAY + "Click me to join the berserker", - ChatColor.GRAY + "class! You will leave your", - ChatColor.GRAY + "current class."}).build()); - } + if (Objects.requireNonNull(PlayerManager.getPlayer(p.getUniqueId())).getCombatClass() == Classes.BERSERKER) inv.setItem(28, classLvl); + else inv.setItem(28, joinClass); + inv.setItem(31, new ItemBuilder(Material.TOTEM_OF_UNDYING, 1, ChatColor.GOLD + "Indomitable Spirit").setLore(new String[]{ ChatColor.GRAY + "As a berserker near death experiences", diff --git a/src/main/java/sugaku/rpg/framework/menus/classes/ClassSubmenu.java b/src/main/java/sugaku/rpg/framework/menus/classes/ClassSubmenu.java index ef8d4d1..f2c3d53 100644 --- a/src/main/java/sugaku/rpg/framework/menus/classes/ClassSubmenu.java +++ b/src/main/java/sugaku/rpg/framework/menus/classes/ClassSubmenu.java @@ -1,10 +1,45 @@ package sugaku.rpg.framework.menus.classes; +import io.github.math0898.rpgframework.items.ItemBuilder; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; import sugaku.rpg.framework.classes.Classes; public abstract class ClassSubmenu { - public ClassSubmenu(){} + /** + * The name of the class this submenu is for. + */ + protected final String className; + + /** + * The block to display when there is an option to join a class. + */ + protected final ItemStack joinClass; + + /** + * The block to display when the player is part of this class. Includes information on xp. + */ + protected final ItemStack classLvl; + + /** + * Creates a new class submenu with the given class name and enum value. + * + * @param className The name of the class this submenu is for. + * @param c The class enum value of this class. + */ + public ClassSubmenu (String className, Classes c) { + this.className = className; // TODO: These menus require a refactor to involve player xp levels. We will likely need to call a function with RpgPlayer parameter which constructs these. + joinClass = new ItemBuilder(Material.EMERALD_BLOCK, ChatColor.GREEN.toString() + ChatColor.BOLD + "Join the class").setLore(new String[]{ + ChatColor.GRAY + "Click me to join the " + className, + ChatColor.GRAY + "class! You will leave your", + ChatColor.GRAY + "current class."}).build(); + classLvl = new ItemBuilder(Material.LAPIS_BLOCK, ChatColor.BLUE + "Lvl: " + getClassLvl(c)).setLore(new String[]{ + ChatColor.GRAY + "Slay bosses and RPG mobs to", + ChatColor.GRAY + "gain xp for your active class.", "", + ChatColor.GRAY + "Xp until next level: " + ChatColor.GREEN + ((getClassLvl(c) * 300) - getClassXp(c)), /*TODO: check that this equation works*/}).build(); + } public int getClassXp(Classes c) { return 0; //TODO diff --git a/src/main/java/sugaku/rpg/framework/menus/classes/PaladinMenu.java b/src/main/java/sugaku/rpg/framework/menus/classes/PaladinMenu.java index 6ba4e74..7a262aa 100644 --- a/src/main/java/sugaku/rpg/framework/menus/classes/PaladinMenu.java +++ b/src/main/java/sugaku/rpg/framework/menus/classes/PaladinMenu.java @@ -17,14 +17,24 @@ public class PaladinMenu extends ClassSubmenu implements Menu { + /** + * Creates a new class submenu with the given paladin name and enum value. + */ + public PaladinMenu () { + super("paladin", Classes.PALADIN); + } + @Override public void onClick(int clicked, Player player) { - switch(clicked) { - case 49: classMenu(player, "main"); break; + switch (clicked) { + case 49 -> classMenu(player, "main"); // case 12: classMenu(player, "Mend"); // case 14: classMenu(player, "Purify"); // case 16: classMenu(player, "Holy Form"); - case 28: Objects.requireNonNull(PlayerManager.getPlayer(player.getUniqueId())).joinClass(Classes.PALADIN); classMenu(player, "Paladin"); break; + case 28 -> { + Objects.requireNonNull(PlayerManager.getPlayer(player.getUniqueId())).joinClass(Classes.PALADIN); + classMenu(player, "Paladin"); + } // case 32: classMenu(player, "Protection"); } } @@ -36,8 +46,6 @@ public void build(Inventory inv, Player p) { inv.setItem(49, goBack); int classPoints = getClassPoints(Classes.PALADIN); - int level = getClassLvl(Classes.PALADIN); - int xp = getClassXp(Classes.PALADIN); inv.setItem(10, new ItemBuilder(Material.GOLDEN_SHOVEL, Math.max(1, classPoints), ChatColor.DARK_GREEN + "Class points: " + classPoints).setLore(new String[]{ ChatColor.GRAY + "Spend class points to upgrade", @@ -68,17 +76,8 @@ public void build(Inventory inv, Player p) { ChatColor.GRAY + "- Health Bonus: " + ChatColor.GREEN + 10 + "hp"/*TODO: add player upgrades*/, brackets(ChatColor.RED + "Disabled") + " -" + ChatColor.RED + " Odd functionality"}).build()); - if (Objects.requireNonNull(PlayerManager.getPlayer(p.getUniqueId())).getCombatClass() == Classes.PALADIN) { - inv.setItem(28, new ItemBuilder(Material.LAPIS_BLOCK, 1, ChatColor.BLUE + "Lvl: " + level).setLore(new String[]{ - ChatColor.GRAY + "Slay bosses and RPG mobs to", - ChatColor.GRAY + "gain xp for your active class.", "", - ChatColor.GRAY + "Xp until next level: " + ChatColor.GREEN + ((level*300) - xp), /*TODO: check that this equation works*/}).build()); - } else { - inv.setItem(28, new ItemBuilder(Material.EMERALD_BLOCK, 1, ChatColor.GREEN.toString() + ChatColor.BOLD + "Join the class").setLore(new String[]{ - ChatColor.GRAY + "Click me to join the paladin", - ChatColor.GRAY + "class! You will leave your", - ChatColor.GRAY + "current class."}).build()); - } + if (Objects.requireNonNull(PlayerManager.getPlayer(p.getUniqueId())).getCombatClass() == Classes.PALADIN) inv.setItem(28, classLvl); + else inv.setItem(28, joinClass); inv.setItem(32, new ItemBuilder(Material.TOTEM_OF_UNDYING, 1, ChatColor.GOLD + "Protection of the Healer").setLore(new String[]{ ChatColor.GRAY + "To prevent death latent healing magic", diff --git a/src/main/java/sugaku/rpg/framework/menus/classes/PyromancerMenu.java b/src/main/java/sugaku/rpg/framework/menus/classes/PyromancerMenu.java index 8adce89..e38b2c2 100644 --- a/src/main/java/sugaku/rpg/framework/menus/classes/PyromancerMenu.java +++ b/src/main/java/sugaku/rpg/framework/menus/classes/PyromancerMenu.java @@ -16,14 +16,24 @@ public class PyromancerMenu extends ClassSubmenu implements Menu { + /** + * Creates a new class submenu with the given pyromancer name and enum value. + */ + public PyromancerMenu () { + super("pyromancer", Classes.PYROMANCER); + } + @Override public void onClick(int clicked, Player player) { - switch(clicked) { - case 49: classMenu(player, "main"); break; + switch (clicked) { + case 49 -> classMenu(player, "main"); // case 12: classMenu(player, "Haste"); // case 14: classMenu(player, "Rage"); // case 16: classMenu(player, "Brute Strength"); - case 28: Objects.requireNonNull(PlayerManager.getPlayer(player.getUniqueId())).joinClass(Classes.PYROMANCER); classMenu(player, "Pyromancer"); break; + case 28 -> { + Objects.requireNonNull(PlayerManager.getPlayer(player.getUniqueId())).joinClass(Classes.PYROMANCER); + classMenu(player, "Pyromancer"); + } // case 32: classMenu(player, "Indomitable Spirit"); } } @@ -35,8 +45,6 @@ public void build(Inventory inv, Player p) { inv.setItem(49, goBack); int classPoints = getClassPoints(Classes.PYROMANCER); - int level = getClassLvl(Classes.PYROMANCER); - int xp = getClassXp(Classes.PYROMANCER); inv.setItem(10, new ItemBuilder(Material.BLAZE_POWDER, Math.max(1, classPoints), ChatColor.DARK_GREEN + "Class points: " + classPoints).setLore(new String[]{ ChatColor.GRAY + "Spend class points to upgrade", @@ -63,17 +71,8 @@ public void build(Inventory inv, Player p) { ChatColor.GRAY + "flame you've developed a strong", ChatColor.GRAY + "resistance to it."}).build()); - if (Objects.requireNonNull(PlayerManager.getPlayer(p.getUniqueId())).getCombatClass() == Classes.PYROMANCER) { - inv.setItem(28, new ItemBuilder(Material.LAPIS_BLOCK, 1, ChatColor.BLUE + "Lvl: " + level).setLore(new String[]{ - ChatColor.GRAY + "Slay bosses and RPG mobs to", - ChatColor.GRAY + "gain xp for your active class.", "", - ChatColor.GRAY + "Xp until next level: " + ChatColor.GREEN + ((level*300) - xp), /*TODO: check that this equation works*/}).build()); - } else { - inv.setItem(28, new ItemBuilder(Material.EMERALD_BLOCK, 1, ChatColor.GREEN.toString() + ChatColor.BOLD + "Join the class").setLore(new String[]{ - ChatColor.GRAY + "Click me to join the pyromancer", - ChatColor.GRAY + "class! You will leave your", - ChatColor.GRAY + "current class."}).build()); - } + if (Objects.requireNonNull(PlayerManager.getPlayer(p.getUniqueId())).getCombatClass() == Classes.PYROMANCER) inv.setItem(28, classLvl); + else inv.setItem(28, joinClass); inv.setItem(32, new ItemBuilder(Material.TOTEM_OF_UNDYING, 1, ChatColor.GOLD + "Phoenix Renewal").setLore(new String[]{ ChatColor.GRAY + "Call upon the power of the phoenix", From 9e8e69532360e069380389004925c59c334749ac Mon Sep 17 00:00:00 2001 From: math0898 <25396616+math0898@users.noreply.github.com> Date: Fri, 5 May 2023 23:09:52 -0500 Subject: [PATCH 7/9] Fixed Damage Indicator when Damage event canceled Fixed bugged item --- .../damage/AdvancedDamageHandler.java | 2 +- .../rpg/framework/RPGEventListener.java | 49 ++++++++++++++++--- .../rpg/framework/items/ItemsManager.java | 6 +-- 3 files changed, 47 insertions(+), 10 deletions(-) diff --git a/src/main/java/io/github/math0898/rpgframework/damage/AdvancedDamageHandler.java b/src/main/java/io/github/math0898/rpgframework/damage/AdvancedDamageHandler.java index a916b7b..63b0217 100644 --- a/src/main/java/io/github/math0898/rpgframework/damage/AdvancedDamageHandler.java +++ b/src/main/java/io/github/math0898/rpgframework/damage/AdvancedDamageHandler.java @@ -28,7 +28,7 @@ public class AdvancedDamageHandler implements Listener { * * @param event The damage event. */ - @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void onDamage (EntityDamageEvent event) { event.setDamage(event.getDamage() * 5.00); //Scale damage for the Advanced Damage Calculations AdvancedDamageEvent advancedDamageEvent = new AdvancedDamageEvent(event); diff --git a/src/main/java/sugaku/rpg/framework/RPGEventListener.java b/src/main/java/sugaku/rpg/framework/RPGEventListener.java index 930275d..90a8105 100644 --- a/src/main/java/sugaku/rpg/framework/RPGEventListener.java +++ b/src/main/java/sugaku/rpg/framework/RPGEventListener.java @@ -3,16 +3,18 @@ import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Material; -import org.bukkit.block.Block; +import org.bukkit.attribute.Attribute; +import org.bukkit.attribute.AttributeModifier; +import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; -import org.bukkit.event.block.Action; import org.bukkit.event.entity.*; import org.bukkit.event.inventory.*; +import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.Inventory; import org.bukkit.event.player.PlayerDropItemEvent; import org.bukkit.event.player.PlayerInteractEvent; @@ -20,8 +22,8 @@ import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.InventoryView; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; import sugaku.rpg.framework.menus.ClassesManager; -//import sugaku.rpg.framework.menus.ForgeManager; import sugaku.rpg.framework.items.ItemsManager; import sugaku.rpg.framework.mobs.BossRituals; import sugaku.rpg.framework.mobs.MobManager; @@ -31,11 +33,14 @@ import sugaku.rpg.mobs.teir1.krusk.KruskBoss; import sugaku.rpg.mobs.teir1.krusk.KruskMinion; +import java.util.ArrayList; +import java.util.Map; import java.util.Objects; +import java.util.UUID; + +import static org.bukkit.attribute.AttributeModifier.Operation.ADD_NUMBER; +import static sugaku.rpg.framework.items.ItemsManager.*; -//import static sugaku.rpg.framework.menus.ForgeManager.forgeClose; -import static sugaku.rpg.framework.items.ItemsManager.updateArmor; -import static sugaku.rpg.framework.items.ItemsManager.updateEffects; public class RPGEventListener implements Listener { @@ -148,6 +153,30 @@ public void onPlayerInteract(PlayerInteractEvent event) { // } } + private ItemStack bugggedKruskHelm () { + ItemStack bugged = new ItemStack(Material.DIAMOND_HELMET, 1); + ItemMeta meta = bugged.getItemMeta(); + assert meta != null; + + meta.setUnbreakable(true); + meta.addAttributeModifier(Attribute.GENERIC_MAX_HEALTH, new AttributeModifier(new UUID(4, 1), "generic.health", 16, ADD_NUMBER, EquipmentSlot.FEET)); + meta.addAttributeModifier(Attribute.GENERIC_ARMOR, new AttributeModifier(new UUID(4,2), "generic.armor", 1.25, ADD_NUMBER, EquipmentSlot.FEET)); + meta.addAttributeModifier(Attribute.GENERIC_ARMOR_TOUGHNESS, new AttributeModifier(new UUID(4,3), "generic.armorToughness", 2.25, ADD_NUMBER, EquipmentSlot.FEET)); + + meta.setDisplayName(ChatColor.BLUE + "Krusk's Trusty Helmet"); + ArrayList lore = new ArrayList<>(); + lore.add(ChatColor.GRAY + "This is " + ChatColor.GREEN + "Krusk's " + ChatColor.GRAY + "helmet from life. It"); + lore.add(ChatColor.GRAY + "was his good luck charm. If only he"); + lore.add(ChatColor.GRAY + "was wearing it that fateful day..."); + lore.add(ChatColor.GRAY + "maybe... " + ChatColor.GREEN + "Krusk "+ ChatColor.GRAY + "would've lived long"); + lore.add(ChatColor.GRAY + "enough to save enough pevsar to"); + lore.add(ChatColor.GRAY + "buy his own house."); + meta.setLore(lore); + + bugged.setItemMeta(meta); + return bugged; + } + /** * When an item is dropped. */ @@ -162,6 +191,14 @@ public void onDrop(PlayerDropItemEvent e) { if (isArmor(itemDropped.getType())) Bukkit.getServer().getScheduler().runTask(main.plugin, () -> updateArmor(itemDropped)); } + } else if (itemDropped.getItemMeta().isUnbreakable() && itemDropped.getType() == Material.DIAMOND_HELMET) { + Map enchants = itemDropped.getEnchantments(); + ItemStack toCmp = bugggedKruskHelm(); + toCmp.addEnchantments(enchants); + if (itemDropped.equals(toCmp)) { + itemDropped.setItemMeta(KruskHelmet.getItemMeta()); + itemDropped.addEnchantments(enchants); + } } BossRituals.general(e); } diff --git a/src/main/java/sugaku/rpg/framework/items/ItemsManager.java b/src/main/java/sugaku/rpg/framework/items/ItemsManager.java index 32d9653..ab917cf 100644 --- a/src/main/java/sugaku/rpg/framework/items/ItemsManager.java +++ b/src/main/java/sugaku/rpg/framework/items/ItemsManager.java @@ -218,9 +218,9 @@ public static void createKruskHelmet() { assert meta != null; meta.setUnbreakable(true); - meta.addAttributeModifier(Attribute.GENERIC_MAX_HEALTH, new AttributeModifier(new UUID(4, 1), "generic.health", 16, ADD_NUMBER, EquipmentSlot.FEET)); - meta.addAttributeModifier(Attribute.GENERIC_ARMOR, new AttributeModifier(new UUID(4,2), "generic.armor", 1.25, ADD_NUMBER, EquipmentSlot.FEET)); - meta.addAttributeModifier(Attribute.GENERIC_ARMOR_TOUGHNESS, new AttributeModifier(new UUID(4,3), "generic.armorToughness", 2.25, ADD_NUMBER, EquipmentSlot.FEET)); + meta.addAttributeModifier(Attribute.GENERIC_MAX_HEALTH, new AttributeModifier(new UUID(4, 1), "generic.health", 16, ADD_NUMBER, EquipmentSlot.HEAD)); + meta.addAttributeModifier(Attribute.GENERIC_ARMOR, new AttributeModifier(new UUID(4,2), "generic.armor", 1.25, ADD_NUMBER, EquipmentSlot.HEAD)); + meta.addAttributeModifier(Attribute.GENERIC_ARMOR_TOUGHNESS, new AttributeModifier(new UUID(4,3), "generic.armorToughness", 2.25, ADD_NUMBER, EquipmentSlot.HEAD)); meta.setDisplayName(ChatColor.BLUE + "Krusk's Trusty Helmet"); ArrayList lore = new ArrayList<>(); From b3522e330b81731b5497734e72ed5731720220df Mon Sep 17 00:00:00 2001 From: math0898 <25396616+math0898@users.noreply.github.com> Date: Sun, 14 May 2023 15:38:33 -0500 Subject: [PATCH 8/9] Collections Added! --- .../math0898/rpgframework}/FileManager.java | 117 +++--------------- .../math0898/rpgframework/ItemCollection.java | 67 ++++++++++ .../math0898/rpgframework/UserData.java | 84 +++++++++++++ .../collections/CandidateCollectionEvent.java | 15 +++ .../collections/CollectionListener.java | 26 ++++ .../collections/CollectionManager.java | 70 +++++++++++ .../damage/AdvancedDamageHandler.java | 13 +- .../io/github/math0898/rpgframework/main.java | 4 + .../rpg/framework/RPGEventListener.java | 1 + .../java/sugaku/rpg/framework/UserData.java | 84 ------------- .../rpg/framework/players/PlayerManager.java | 2 +- src/main/java/sugaku/rpg/main.java | 3 +- 12 files changed, 298 insertions(+), 188 deletions(-) rename src/main/java/{sugaku/rpg/framework => io/github/math0898/rpgframework}/FileManager.java (52%) create mode 100644 src/main/java/io/github/math0898/rpgframework/ItemCollection.java create mode 100644 src/main/java/io/github/math0898/rpgframework/UserData.java create mode 100644 src/main/java/io/github/math0898/rpgframework/collections/CandidateCollectionEvent.java create mode 100644 src/main/java/io/github/math0898/rpgframework/collections/CollectionListener.java create mode 100644 src/main/java/io/github/math0898/rpgframework/collections/CollectionManager.java delete mode 100644 src/main/java/sugaku/rpg/framework/UserData.java diff --git a/src/main/java/sugaku/rpg/framework/FileManager.java b/src/main/java/io/github/math0898/rpgframework/FileManager.java similarity index 52% rename from src/main/java/sugaku/rpg/framework/FileManager.java rename to src/main/java/io/github/math0898/rpgframework/FileManager.java index 297c607..14b0c00 100644 --- a/src/main/java/sugaku/rpg/framework/FileManager.java +++ b/src/main/java/io/github/math0898/rpgframework/FileManager.java @@ -1,21 +1,16 @@ -package sugaku.rpg.framework; +package io.github.math0898.rpgframework; import org.bukkit.Bukkit; import org.bukkit.ChatColor; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; -import sugaku.rpg.factions.Faction; -import sugaku.rpg.factions.FactionData; -import sugaku.rpg.framework.classes.Classes; import sugaku.rpg.framework.players.PlayerManager; import java.io.File; -import java.io.FileWriter; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.Objects; -import java.util.Scanner; import java.util.UUID; public class FileManager { @@ -71,8 +66,7 @@ public static void init(Player p) { try { file.delete(); if(file.createNewFile()) { - FactionData[] norm = {new FactionData(0, Faction.ABYSS), new FactionData(0, Faction.ELEMENTAL)}; - PlayerManager.addUserData(new UserData(norm, p.getUniqueId())); + PlayerManager.addUserData(new UserData(p.getUniqueId())); save(p); console("Created new file for " + p.getName() + "!", ChatColor.GREEN); } @@ -83,7 +77,7 @@ public static void init(Player p) { * Unloads the data on the given player. * @param p The player who's data should be unloaded. */ - public static void unload(Player p) { + public static void unload (Player p) { console("Unloading data on " + p.getName()); save(p); @@ -97,21 +91,18 @@ public static void unload(Player p) { * Reads the associated file for the given player. If no file is found it calls init(Player) to create one. * @param p The player's file which should be read. */ - public static void load(Player p) { + public static void load (Player p) { console("Loading player data for " + p.getName() + "."); File file = new File("./plugins/RPG/PlayerData/" + p.getUniqueId()); + UserData data = new UserData(p.getUniqueId()); try { - Scanner scanner = new Scanner(file); - - switch (scanner.nextLine()) { - case "1.0": reader1_0(p, scanner); - case "1.1": reader1_1(p, scanner); - case "1.2": reader1_2(p, scanner); - } - - scanner.close(); - + YamlConfiguration config = YamlConfiguration.loadConfiguration(file); + ConfigurationSection collections = config.getConfigurationSection("collections"); + if (collections != null) + for (String s : collections.getKeys(false)) + data.addCollection(s, new ItemCollection(collections.getConfigurationSection(s))); // TODO: should this be part of UserData? + PlayerManager.addUserData(data); console("Loaded player data for " + p.getName() + ".", ChatColor.GREEN); } catch (Exception e) { console("File not found for " + p.getName() + ".", ChatColor.YELLOW); @@ -119,67 +110,6 @@ public static void load(Player p) { } } - /** - * Translates the data in the scanner into a UserData object for Player p. - * @param p The player who we're making the UserData for - * @param s The scanner which holds the data dump - */ - private static void reader1_0 (Player p, Scanner s) { - ArrayList data = new ArrayList<>(); - - while(s.hasNextLine()) { - String faction = s.nextLine(); - int rep = s.nextInt(); - s.nextLine(); - if (faction.equals("Abyss")) data.add(new FactionData(rep, Faction.ABYSS)); - else if (faction.equals("Elemental")) data.add(new FactionData(rep, Faction.ELEMENTAL)); - } - - PlayerManager.addUserData(new UserData(data.toArray(new FactionData[0]), p.getUniqueId())); - } - - /** - * Translates the data in the scanner into a UserData object for Player p. - * @param p The player who we're making the UserData for. - * @param s The scanner which holds the data dump. - */ - private static void reader1_1 (Player p, Scanner s) { - ArrayList data = new ArrayList<>(); - - s.nextLine(); - data.add(new FactionData(Integer.parseInt(s.nextLine()), Faction.ABYSS)); - s.nextLine(); - data.add(new FactionData(Integer.parseInt(s.nextLine()), Faction.ELEMENTAL)); - Objects.requireNonNull(PlayerManager.getPlayer(p.getUniqueId())).joinClass(Classes.fromString(s.nextLine())); - - PlayerManager.addUserData(new UserData(data.toArray(new FactionData[0]), p.getUniqueId())); - } - - /** - * Translate the data in the scanner into a UserData object for Player p. Also loads data like class levels. - * - * @param p The player who we're making the UserData for. - * @param s The scanner which holds the data dump. - */ - private static void reader1_2 (Player p, Scanner s) { - ArrayList data = new ArrayList<>(); - - s.nextLine(); - data.add(new FactionData(Integer.parseInt(s.nextLine()), Faction.ABYSS)); - s.nextLine(); - data.add(new FactionData(Integer.parseInt(s.nextLine()), Faction.ELEMENTAL)); - Objects.requireNonNull(PlayerManager.getPlayer(p.getUniqueId())).joinClass(Classes.fromString(s.nextLine())); - - int[] a = new int[]{Integer.parseInt(s.nextLine()), - Integer.parseInt(s.nextLine()), - Integer.parseInt(s.nextLine()), - Integer.parseInt(s.nextLine()), - Integer.parseInt(s.nextLine()), - Integer.parseInt(s.nextLine()), - Integer.parseInt(s.nextLine())}; - - PlayerManager.addUserData(new UserData(data.toArray(new FactionData[0]), p.getUniqueId(), a)); - } /** * Saves the player's data into their file. * @param p The player who's data we're saving. @@ -203,22 +133,11 @@ private static void save(String name, UUID uuid) { console("Saving data for " + name + "."); try { - FileWriter writer = new FileWriter("./plugins/RPG/PlayerData/" + uuid); - UserData save = null; - for (UserData d: PlayerManager.getUserData()) if (d.getUuid() == uuid) { save = d; break; } - if (save == null) { console("Unable to find " + name + "'s data among loaded data.", ChatColor.RED); return; } - - writer.write("1.1\n"); - writer.write("Abyss\n"); - writer.write(save.getAbyssData().getReputation() + "\n"); - writer.write("Elemental\n"); - writer.write(save.getElementalData().getReputation() + "\n"); - writer.write(Objects.requireNonNull(PlayerManager.getPlayer(uuid)).getCombatClassString() + "\n"); - -// int[] a = Objects.requireNonNull(PlayerManager.getUserData(uuid)).getXp(); -// for (int i = 0; i < a.length; i++) writer.write(a[i]); - writer.close(); - + UserData data = PlayerManager.getUserData(uuid); + if (data == null) throw new IOException("Player does not have data!"); + YamlConfiguration config = new YamlConfiguration(); + data.toConfigurationSection(config); + config.save("./plugins/RPG/PlayerData/" + uuid); console("Saved data for " + name + "!", ChatColor.GREEN); } catch (IOException e) { diff --git a/src/main/java/io/github/math0898/rpgframework/ItemCollection.java b/src/main/java/io/github/math0898/rpgframework/ItemCollection.java new file mode 100644 index 0000000..d08bd77 --- /dev/null +++ b/src/main/java/io/github/math0898/rpgframework/ItemCollection.java @@ -0,0 +1,67 @@ +package io.github.math0898.rpgframework; + +import com.google.common.primitives.UnsignedLong; +import org.bukkit.configuration.ConfigurationSection; + +/** + * An ItemCollection contains the score that a given player has for a specific resource. + * + * @author Sugaku + */ +public class ItemCollection { + + /** + * The value of this collection. + */ + private UnsignedLong value; + + /** + * Creates a new ItemCollection with the given value. + * + * @param val The value to assign to this ItemCollection. + */ + public ItemCollection (long val) { + value = UnsignedLong.valueOf(val); + } + + /** + * Creates a new ItemCollection from the given configuration section. + * + * @param sec The configuration section to create this ItemCollection from. + */ + public ItemCollection (ConfigurationSection sec) { + if (sec != null) + if (sec.contains("value")) { + value = UnsignedLong.valueOf(sec.getLong("value", 0)); + return; + } + value = UnsignedLong.ZERO; + } + + /** + * Assigns the necessary information to the given ConfigurationSection to reconstruct this object. + * + * @param sec The configuration section to assign data to. + */ + public void toConfigurationSection (ConfigurationSection sec) { + sec.set("value", value.longValue()); + } + + /** + * Adds the given value to the ItemCollection. + * + * @param val The value to add onto this ItemCollection. + */ + public void add (long val) { + value = value.plus(UnsignedLong.valueOf(val)); + } + + /** + * Returns the value stored in this ItemCollection. + * + * @return The value stored in this ItemCollection. + */ + public long get () { + return value.longValue(); + } +} diff --git a/src/main/java/io/github/math0898/rpgframework/UserData.java b/src/main/java/io/github/math0898/rpgframework/UserData.java new file mode 100644 index 0000000..cdd805b --- /dev/null +++ b/src/main/java/io/github/math0898/rpgframework/UserData.java @@ -0,0 +1,84 @@ +package io.github.math0898.rpgframework; + +import org.bukkit.configuration.ConfigurationSection; +import sugaku.rpg.factions.Faction; +import sugaku.rpg.factions.FactionData; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +public class UserData { + + /** + * The UUID of the player who's data is loaded. + */ + private final UUID uuid; + + /** + * A map of the collections that this player has. Some may be null. + */ + private final Map collections = new HashMap<>(); + + /** + * Creates a new empty UserData which data can be assigned to. + * + * @param uuid The uuid of the player this data is for. + */ + public UserData (UUID uuid) { + this.uuid = uuid; + } + + /** + * Adds a collection to this UserData if not present. + * + * @param name The name of the collection to add. + * @param collection The ItemCollection object to assign. + */ + public void addCollection (String name, ItemCollection collection) { + collections.put(name, collection); + } + + /** + * Accessor method for collections if they are present in this UserData. + * + * @param name The name of the collection to grab. + * @return The ItemCollection that may or may not have been found. + */ + public ItemCollection getCollection (String name) { + return collections.get(name); + } + + /** + * Assigns the important values of this UserData to the given ConfigurationSection. + * + * @param sec The configuration section to assign the important values to. + */ + public void toConfigurationSection (ConfigurationSection sec) { + if (!collections.isEmpty()) { + ConfigurationSection col = sec.createSection("collections"); + for (String c : collections.keySet()) + collections.get(c).toConfigurationSection(col.createSection(c)); + } + } + + /** + * Accesses the data on the Abyss faction. + * @return The data on the abyss faction. + */ + @Deprecated + public FactionData getAbyssData() { return new FactionData(0, Faction.ABYSS); } + + /** + * Access the data on the Elementals for the player. + * @return The data on the elemental faction. + */ + @Deprecated + public FactionData getElementalData() { return new FactionData(0, Faction.ELEMENTAL); } + + /** + * Access the uuid of the player this data is on and return it. + * @return The uuid of the player. + */ + public UUID getUuid() { return uuid; } +} diff --git a/src/main/java/io/github/math0898/rpgframework/collections/CandidateCollectionEvent.java b/src/main/java/io/github/math0898/rpgframework/collections/CandidateCollectionEvent.java new file mode 100644 index 0000000..8d8cd01 --- /dev/null +++ b/src/main/java/io/github/math0898/rpgframework/collections/CandidateCollectionEvent.java @@ -0,0 +1,15 @@ +package io.github.math0898.rpgframework.collections; + +import org.bukkit.Material; + +import java.util.UUID; + +/** + * The CandidateCollectionEvent stores all the information the CollectionManager needs to consider a particular event in + * a single object, so we can store it in a stack easily. + * + * @param type The material involved. + * @param amount The number of items. + * @param player The uuid of the player who may be credited. + */ +public record CandidateCollectionEvent (Material type, long amount, UUID player) { } diff --git a/src/main/java/io/github/math0898/rpgframework/collections/CollectionListener.java b/src/main/java/io/github/math0898/rpgframework/collections/CollectionListener.java new file mode 100644 index 0000000..4fc2ccc --- /dev/null +++ b/src/main/java/io/github/math0898/rpgframework/collections/CollectionListener.java @@ -0,0 +1,26 @@ +package io.github.math0898.rpgframework.collections; + +import org.bukkit.entity.Item; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockDropItemEvent; + +/** + * The CollectionListener listens to events that could add to a player's collection. We catalog these events until they + * can be handled async by the CollectionManager. + * + * @author Sugaku + */ +public class CollectionListener implements Listener { + + /** + * Called whenever a block is broken. + * + * @param event The block break event to pass onto the CollectionManager. + */ + @EventHandler + public void onBlockBreak (BlockDropItemEvent event) { + if (event.getItems().size() == 0) return; + for (Item i : event.getItems()) CollectionManager.getInstance().addEvent(new CandidateCollectionEvent(i.getItemStack().getType(), i.getItemStack().getAmount(), event.getPlayer().getUniqueId())); + } +} diff --git a/src/main/java/io/github/math0898/rpgframework/collections/CollectionManager.java b/src/main/java/io/github/math0898/rpgframework/collections/CollectionManager.java new file mode 100644 index 0000000..4754b93 --- /dev/null +++ b/src/main/java/io/github/math0898/rpgframework/collections/CollectionManager.java @@ -0,0 +1,70 @@ +package io.github.math0898.rpgframework.collections; + +import io.github.math0898.rpgframework.ItemCollection; +import io.github.math0898.rpgframework.UserData; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import sugaku.rpg.framework.players.PlayerManager; + +import java.util.Arrays; +import java.util.List; +import java.util.Stack; + +import static io.github.math0898.rpgframework.main.plugin; + +/** + * The CollectionManager manages collections related events and adds them to UserData async. + * + * @author Sugaku + */ +public class CollectionManager { + + /** + * A stack of CandidateCollectionEvents that need to be handled. + */ + private final Stack events = new Stack<>(); + + /** + * A single instance of CollectionManager that should be used across the plugin. + */ + private static final CollectionManager collectionManager = new CollectionManager(); + + /** + * The materials that collections are on for. + */ + private static final List ALLOWED_MATERIALS = Arrays.asList(Material.CARROT, Material.DIAMOND, Material.RAW_IRON, Material.RAW_COPPER, Material.RAW_GOLD, Material.COAL, Material.WHEAT, Material.POTATO, Material.COCOA, Material.COBBLED_DEEPSLATE, Material.COBBLESTONE, Material.BIRCH_LOG, Material.DARK_OAK_LOG, Material.OAK_LOG, Material.SPRUCE_LOG, Material.LAPIS_LAZULI); + + /** + * Accessor method for the singleton instance of the CollectionManager. + * + * @return The singleton instance of the CollectionManager. + */ + public static CollectionManager getInstance () { + return collectionManager; + } + + /** + * Adds an event to the queue of events. + * + * @param event The event to add to the events. + */ + public void addEvent (CandidateCollectionEvent event) { + this.events.add(event); + } + + /** + * Runs the CollectionManager. + */ + public void run () { + while (!events.empty()) { + CandidateCollectionEvent e = events.pop(); + if (!ALLOWED_MATERIALS.contains(e.type())) continue; + UserData data = PlayerManager.getUserData(e.player()); + if (data == null) continue; + String name = e.type().toString(); + if (data.getCollection(name) == null) data.addCollection(name, new ItemCollection(e.amount())); + else data.getCollection(name).add(e.amount()); + } + Bukkit.getScheduler().runTaskLaterAsynchronously(plugin, this::run, 15 * 20); + } +} diff --git a/src/main/java/io/github/math0898/rpgframework/damage/AdvancedDamageHandler.java b/src/main/java/io/github/math0898/rpgframework/damage/AdvancedDamageHandler.java index 63b0217..503f00f 100644 --- a/src/main/java/io/github/math0898/rpgframework/damage/AdvancedDamageHandler.java +++ b/src/main/java/io/github/math0898/rpgframework/damage/AdvancedDamageHandler.java @@ -22,13 +22,23 @@ */ public class AdvancedDamageHandler implements Listener { + /** + * Called at the very end of DamageEvents to display the damage dealt. + * + * @param event The event to display. + */ + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onDamageDisplay (EntityDamageEvent event) { + if (main.useHolographicDisplays) displayDamage(event.getDamage() * 5.00, event.getEntity().getLocation()); + } + /** * Where the conversion from DamageEvent to AdvancedDamageEvent occurs. Any handlers after this point will be * ignored since the values are already grabbed. * * @param event The damage event. */ - @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) public void onDamage (EntityDamageEvent event) { event.setDamage(event.getDamage() * 5.00); //Scale damage for the Advanced Damage Calculations AdvancedDamageEvent advancedDamageEvent = new AdvancedDamageEvent(event); @@ -51,7 +61,6 @@ public void onDamage (EntityDamageEvent event) { double damage = damageCalculation(advancedDamageEvent); event.setDamage(damage/5.00); - if (main.useHolographicDisplays) displayDamage(damage, event.getEntity().getLocation()); } /** diff --git a/src/main/java/io/github/math0898/rpgframework/main.java b/src/main/java/io/github/math0898/rpgframework/main.java index 8f65639..6008c20 100644 --- a/src/main/java/io/github/math0898/rpgframework/main.java +++ b/src/main/java/io/github/math0898/rpgframework/main.java @@ -1,5 +1,7 @@ package io.github.math0898.rpgframework; +import io.github.math0898.rpgframework.collections.CollectionListener; +import io.github.math0898.rpgframework.collections.CollectionManager; import io.github.math0898.rpgframework.damage.AdvancedDamageHandler; import io.github.math0898.rpgframework.forge.ForgeManager; import io.github.math0898.rpgframework.items.GiveCommand; @@ -72,6 +74,7 @@ public void onEnable () { //Register damage listeners Bukkit.getPluginManager().registerEvents(new AdvancedDamageHandler(), this); + Bukkit.getPluginManager().registerEvents(new CollectionListener(), this); PartyManager.init(); PlayerManager.init(); ForgeManager.getInstance(); @@ -89,6 +92,7 @@ public void onEnable () { Objects.requireNonNull(Bukkit.getPluginCommand("rpg-give")).setExecutor(new GiveCommand()); Objects.requireNonNull(Bukkit.getPluginCommand("rpg-give")).setTabCompleter(GiveCommand.autocomplete); + Bukkit.getScheduler().runTaskAsynchronously(this, () -> CollectionManager.getInstance().run()); sugaku.rpg.main.onEnable(); console("Plugin enabled! " + ChatColor.DARK_GRAY + "Took: " + (System.currentTimeMillis() - startTime) + "ms", ChatColor.GREEN); diff --git a/src/main/java/sugaku/rpg/framework/RPGEventListener.java b/src/main/java/sugaku/rpg/framework/RPGEventListener.java index 90a8105..ec6d3d3 100644 --- a/src/main/java/sugaku/rpg/framework/RPGEventListener.java +++ b/src/main/java/sugaku/rpg/framework/RPGEventListener.java @@ -1,5 +1,6 @@ package sugaku.rpg.framework; +import io.github.math0898.rpgframework.FileManager; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Material; diff --git a/src/main/java/sugaku/rpg/framework/UserData.java b/src/main/java/sugaku/rpg/framework/UserData.java deleted file mode 100644 index 049ea88..0000000 --- a/src/main/java/sugaku/rpg/framework/UserData.java +++ /dev/null @@ -1,84 +0,0 @@ -package sugaku.rpg.framework; - -import sugaku.rpg.factions.FactionData; - -import java.util.UUID; - -public class UserData { - - /** - * The data relating to the abyss for the player. - */ - private FactionData AbyssData; - - /** - * The data relating to the elementals for the player. - */ - private FactionData ElementalData; - - /** - * The UUID of the player who's data is loaded. - */ - private final UUID uuid; - - /** - * The xp the player has with each class. - */ - private int[] xp; - - /** - * Creates UserData with the given faction data. - */ - public UserData(FactionData[] factionData, UUID uuid) { - for (FactionData f : factionData) { - switch(f.getFaction()) { - case ABYSS: AbyssData = f; - case ELEMENTAL: ElementalData = f; - } - } - this.uuid = uuid; - } - - /** - * Creates UserData with the given faction data and class xp data. - * - * @param factionData The faction data array. - * @param uuid The uuid of the player who's data this is. - * @param classXp The xp for each class the player has joined. - */ - public UserData(FactionData[] factionData, UUID uuid, int[] classXp) { - for (FactionData f : factionData) { - switch(f.getFaction()) { - case ABYSS: AbyssData = f; - case ELEMENTAL: ElementalData = f; - } - } - this.uuid = uuid; - xp = classXp; - } - - /** - * Accesses the data on the Abyss faction. - * @return The data on the abyss faction. - */ - public FactionData getAbyssData() { return AbyssData; } - - /** - * Access the data on the Elementals for the player. - * @return The data on the elemental faction. - */ - public FactionData getElementalData() { return ElementalData; } - - /** - * Access the uuid of the player this data is on and return it. - * @return The uuid of the player. - */ - public UUID getUuid() { return uuid; } - - /** - * Access the xp of the player's classes and returns it. - * - * @return The int array which holds the xp for all of the classes. - */ - public int[] getXp() { return xp; } -} diff --git a/src/main/java/sugaku/rpg/framework/players/PlayerManager.java b/src/main/java/sugaku/rpg/framework/players/PlayerManager.java index f50f954..6babaee 100644 --- a/src/main/java/sugaku/rpg/framework/players/PlayerManager.java +++ b/src/main/java/sugaku/rpg/framework/players/PlayerManager.java @@ -7,7 +7,7 @@ import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityExhaustionEvent; import org.bukkit.potion.PotionEffect; -import sugaku.rpg.framework.UserData; +import io.github.math0898.rpgframework.UserData; import sugaku.rpg.main; import java.util.*; diff --git a/src/main/java/sugaku/rpg/main.java b/src/main/java/sugaku/rpg/main.java index c997329..5a993af 100644 --- a/src/main/java/sugaku/rpg/main.java +++ b/src/main/java/sugaku/rpg/main.java @@ -3,10 +3,9 @@ import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; import org.bukkit.plugin.java.JavaPlugin; import sugaku.rpg.framework.CommandManager; -import sugaku.rpg.framework.FileManager; +import io.github.math0898.rpgframework.FileManager; import sugaku.rpg.framework.classes.implementations.Pyromancer; import sugaku.rpg.framework.items.ItemsManager; import sugaku.rpg.framework.RPGEventListener; From 8cb125e06d5172d223c716337831d520259ab840 Mon Sep 17 00:00:00 2001 From: math0898 <25396616+math0898@users.noreply.github.com> Date: Mon, 15 May 2023 18:39:25 -0500 Subject: [PATCH 9/9] Basic Collections Command --- .../math0898/rpgframework/UserData.java | 21 ++++++++++ .../collections/CollectionsCommand.java | 40 +++++++++++++++++++ .../io/github/math0898/rpgframework/main.java | 3 ++ src/main/resources/plugin.yml | 2 + 4 files changed, 66 insertions(+) create mode 100644 src/main/java/io/github/math0898/rpgframework/collections/CollectionsCommand.java diff --git a/src/main/java/io/github/math0898/rpgframework/UserData.java b/src/main/java/io/github/math0898/rpgframework/UserData.java index cdd805b..9717529 100644 --- a/src/main/java/io/github/math0898/rpgframework/UserData.java +++ b/src/main/java/io/github/math0898/rpgframework/UserData.java @@ -1,11 +1,14 @@ package io.github.math0898.rpgframework; +import org.bukkit.Bukkit; import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.entity.Player; import sugaku.rpg.factions.Faction; import sugaku.rpg.factions.FactionData; import java.util.HashMap; import java.util.Map; +import java.util.Set; import java.util.UUID; public class UserData { @@ -15,6 +18,11 @@ public class UserData { */ private final UUID uuid; + /** + * The username of the player whom this data belongs to. + */ + private final String username; + /** * A map of the collections that this player has. Some may be null. */ @@ -27,6 +35,9 @@ public class UserData { */ public UserData (UUID uuid) { this.uuid = uuid; + Player p = Bukkit.getPlayer(uuid); + if (p != null) username = p.getName(); + else username = "Unknown"; } /** @@ -49,12 +60,22 @@ public ItemCollection getCollection (String name) { return collections.get(name); } + /** + * Accessor method for the list of collections that are present in this UserData. + * + * @return The String set of collections that exist. + */ + public Set registeredCollections () { + return collections.keySet(); + } + /** * Assigns the important values of this UserData to the given ConfigurationSection. * * @param sec The configuration section to assign the important values to. */ public void toConfigurationSection (ConfigurationSection sec) { + sec.set("username", username); if (!collections.isEmpty()) { ConfigurationSection col = sec.createSection("collections"); for (String c : collections.keySet()) diff --git a/src/main/java/io/github/math0898/rpgframework/collections/CollectionsCommand.java b/src/main/java/io/github/math0898/rpgframework/collections/CollectionsCommand.java new file mode 100644 index 0000000..0870cfa --- /dev/null +++ b/src/main/java/io/github/math0898/rpgframework/collections/CollectionsCommand.java @@ -0,0 +1,40 @@ +package io.github.math0898.rpgframework.collections; + +import io.github.math0898.rpgframework.UserData; +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabCompleter; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import sugaku.rpg.framework.players.PlayerManager; + +import java.util.List; + +/** + * The CollectionsCommand allows admins to view and modify player's collection values, as well as players to see their + * own collections and ranking. + * + * @author Sugaku + */ +public class CollectionsCommand implements TabCompleter, CommandExecutor { + + @Override + public boolean onCommand (@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + if (!commandSender.hasPermission("rpg.collections")) return true; + if (commandSender instanceof Player player) { + UserData data = PlayerManager.getUserData(player.getUniqueId()); + if (data == null) return true; + for (String s : data.registeredCollections()) player.sendMessage(ChatColor.GRAY + "> " + s + ": " + data.getCollection(s).get()); + } else commandSender.sendMessage("Command only runnable as player."); + return true; + } + + @Nullable + @Override + public List onTabComplete (@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + return null; + } +} diff --git a/src/main/java/io/github/math0898/rpgframework/main.java b/src/main/java/io/github/math0898/rpgframework/main.java index 6008c20..8d24ec4 100644 --- a/src/main/java/io/github/math0898/rpgframework/main.java +++ b/src/main/java/io/github/math0898/rpgframework/main.java @@ -2,6 +2,7 @@ import io.github.math0898.rpgframework.collections.CollectionListener; import io.github.math0898.rpgframework.collections.CollectionManager; +import io.github.math0898.rpgframework.collections.CollectionsCommand; import io.github.math0898.rpgframework.damage.AdvancedDamageHandler; import io.github.math0898.rpgframework.forge.ForgeManager; import io.github.math0898.rpgframework.items.GiveCommand; @@ -80,6 +81,8 @@ public void onEnable () { ForgeManager.getInstance(); Objects.requireNonNull(Bukkit.getPluginCommand("party")).setExecutor(new PartyCommand()); Objects.requireNonNull(Bukkit.getPluginCommand("party")).setTabCompleter(PartyCommand.autocomplete); + Objects.requireNonNull(Bukkit.getPluginCommand("collections")).setExecutor(new CollectionsCommand()); + Objects.requireNonNull(Bukkit.getPluginCommand("collections")).setTabCompleter(new CollectionsCommand()); //Establish hooks useHolographicDisplays = Bukkit.getPluginManager().isPluginEnabled("HolographicDisplays"); diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index d85c1bd..86f641b 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -26,3 +26,5 @@ commands: permission: rpg.admin classes: permission: rpg.classes + collections: + permission: rpg.collections