From f2345994cab9c0ce6b369c3eb0df8b626bb6e670 Mon Sep 17 00:00:00 2001 From: JISAUAY Date: Mon, 17 Feb 2025 16:58:48 -0600 Subject: [PATCH] add json parsing for easier creation of new mythics --- pom.xml | 12 ++ .../MythicItems/CommandMythicEssence.java | 3 +- .../MythicItems/Mythics/MythicEssence.java | 31 +---- .../hexa/MythicItems/Mythics/MythicItem.java | 124 +++++++++++++++++- .../hexa/MythicItems/Mythics/RockCracker.java | 27 ---- .../net/hexa/MythicItems/Mythics/Terra.java | 26 ---- src/main/resources/mythic-items/essence.json | 11 ++ .../resources/mythic-items/terra-pickaxe.json | 4 +- .../resources/mythic-items/terra-shovel.json | 13 ++ 9 files changed, 165 insertions(+), 86 deletions(-) delete mode 100644 src/main/java/net/hexa/MythicItems/Mythics/RockCracker.java delete mode 100644 src/main/java/net/hexa/MythicItems/Mythics/Terra.java create mode 100644 src/main/resources/mythic-items/essence.json create mode 100644 src/main/resources/mythic-items/terra-shovel.json diff --git a/pom.xml b/pom.xml index bee2213..d0b0d51 100644 --- a/pom.xml +++ b/pom.xml @@ -12,6 +12,18 @@ https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + + + org.apache.maven.plugins + maven-compiler-plugin + + 14 + 14 + + + + diff --git a/src/main/java/net/hexa/MythicItems/CommandMythicEssence.java b/src/main/java/net/hexa/MythicItems/CommandMythicEssence.java index 39a3824..6c0b8e4 100644 --- a/src/main/java/net/hexa/MythicItems/CommandMythicEssence.java +++ b/src/main/java/net/hexa/MythicItems/CommandMythicEssence.java @@ -1,6 +1,7 @@ package net.hexa.MythicItems; import net.hexa.MythicItems.Mythics.MythicEssence; +import net.hexa.MythicItems.Mythics.MythicItem; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; @@ -14,7 +15,7 @@ public class CommandMythicEssence implements CommandExecutor { if (sender instanceof Player) { Player player = (Player) sender; - ItemStack item = new MythicEssence().item; + ItemStack item = MythicItem.getMythicById(0).item; player.getInventory().addItem(item); } diff --git a/src/main/java/net/hexa/MythicItems/Mythics/MythicEssence.java b/src/main/java/net/hexa/MythicItems/Mythics/MythicEssence.java index b957aaf..9f575bc 100644 --- a/src/main/java/net/hexa/MythicItems/Mythics/MythicEssence.java +++ b/src/main/java/net/hexa/MythicItems/Mythics/MythicEssence.java @@ -1,39 +1,18 @@ package net.hexa.MythicItems.Mythics; import org.bukkit.Material; -import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; -import java.util.Arrays; +import java.util.List; import java.util.Random; -public class MythicEssence extends MythicItem { +public class MythicEssence { private static final Random random = new Random(); - - public MythicEssence() { - item = new ItemStack(Material.CLAY_BALL); - - item.addUnsafeEnchantment(Enchantment.FORTUNE, 7); - - ItemMeta itemData = item.getItemMeta(); - itemData.setItemName("§4Mythic Essence"); - itemData.setLore(Arrays.asList("§o§aMaybe this will give you something nice?")); - - item.setItemMeta(itemData); - - setMythicId(0); - } + private static final List mythics = MythicItem.getMythics(); public static ItemStack rollMythic() { - int mythic_id = random.nextInt(2) + 1; - switch (mythic_id) { - case 1: - return new Terra().item; - case 2: - return new RockCracker().item; - } - return new ItemStack(Material.GRAVEL); + int mythic_id = random.nextInt(mythics.size() + 1); + return mythics.get(mythic_id).item; } } diff --git a/src/main/java/net/hexa/MythicItems/Mythics/MythicItem.java b/src/main/java/net/hexa/MythicItems/Mythics/MythicItem.java index 88c7242..fc01fd2 100644 --- a/src/main/java/net/hexa/MythicItems/Mythics/MythicItem.java +++ b/src/main/java/net/hexa/MythicItems/Mythics/MythicItem.java @@ -2,8 +2,8 @@ package net.hexa.MythicItems.Mythics; import org.json.*; -import com.google.gson.JsonObject; - +import org.bukkit.Bukkit; +import org.bukkit.enchantments.Enchantment; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; @@ -11,28 +11,112 @@ import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.persistence.PersistentDataType; import java.io.File; +import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.List; import java.util.Scanner; +import java.util.logging.Logger; public class MythicItem { private static final String MYTHIC_DIR = "resources/mythic-items"; + public ItemStack item; + private static final Logger logger = Bukkit.getServer().getPluginManager().getPlugin("MythicItems").getLogger(); public MythicItem() {} // Parse a mythic item from a json file public MythicItem(JSONObject json) { + if (json == null) { + item = new ItemStack(Material.GRAVEL); + logger.warning("Constructor was passed a NULL JSONObject."); + return; + } + String item_id = json.getString("item_id"); this.item = new ItemStack(Material.getMaterial(item_id)); ItemMeta item_metadata = item.getItemMeta(); - JSONObject enchantments = json.getJSONObject("Enchantments"); - for (String enchanment_key : enchantments.keySet()) { + if (json.has("Unbreakable")) + item_metadata.setUnbreakable(json.getBoolean("Unbreakable")); + if (json.has("Name")) + item_metadata.setItemName(json.getString("Name")); + + if (json.has("Lore")) { + List lines = json.getJSONArray("Lore").toList(); + List lore = new ArrayList<>(); + + for (Object line : lines) { + lore.add(line.toString()); + } + + item_metadata.setLore(lore); + } + + // Add all enchantments + JSONObject enchantments = json.getJSONObject("Enchantments"); + for (String enchantment_key : enchantments.keySet()) { + + int enchantment_level = enchantments.getInt(enchantment_key); + + switch (enchantment_key.toUpperCase()) { + case "UNBREAKING" -> this.item.addUnsafeEnchantment(Enchantment.UNBREAKING, enchantment_level); + case "EFFICIENCY" -> this.item.addUnsafeEnchantment(Enchantment.EFFICIENCY, enchantment_level); + case "PROTECTION" -> this.item.addUnsafeEnchantment(Enchantment.PROTECTION, enchantment_level); + case "FIRE_PROTECTION" -> this.item.addUnsafeEnchantment(Enchantment.FIRE_PROTECTION, enchantment_level); + case "FEATHER_FALLING" -> this.item.addUnsafeEnchantment(Enchantment.FEATHER_FALLING, enchantment_level); + case "BLAST_PROTECTION" -> this.item.addUnsafeEnchantment(Enchantment.BLAST_PROTECTION, enchantment_level); + case "PROJECTILE_PROTECTION" -> this.item.addUnsafeEnchantment(Enchantment.PROJECTILE_PROTECTION, enchantment_level); + case "RESPIRATION" -> this.item.addUnsafeEnchantment(Enchantment.RESPIRATION, enchantment_level); + case "AQUA_AFFINITY" -> this.item.addUnsafeEnchantment(Enchantment.AQUA_AFFINITY, enchantment_level); + case "THORNS" -> this.item.addUnsafeEnchantment(Enchantment.THORNS, enchantment_level); + case "DEPTH_STRIDER" -> this.item.addUnsafeEnchantment(Enchantment.DEPTH_STRIDER, enchantment_level); + case "FROST_WALKER" -> this.item.addUnsafeEnchantment(Enchantment.FROST_WALKER, enchantment_level); + case "BINDING_CURSE" -> this.item.addUnsafeEnchantment(Enchantment.BINDING_CURSE, enchantment_level); // if you want it for some reason + case "SHARPNESS" -> this.item.addUnsafeEnchantment(Enchantment.SHARPNESS, enchantment_level); + case "SMITE" -> this.item.addUnsafeEnchantment(Enchantment.SMITE, enchantment_level); + case "BANE_OF_ARTHROPODS" -> this.item.addUnsafeEnchantment(Enchantment.BANE_OF_ARTHROPODS, enchantment_level); + case "KNOCKBACK" -> this.item.addUnsafeEnchantment(Enchantment.KNOCKBACK, enchantment_level); + case "FIRE_ASPECT" -> this.item.addUnsafeEnchantment(Enchantment.FIRE_ASPECT, enchantment_level); + case "LOOTING" -> this.item.addUnsafeEnchantment(Enchantment.LOOTING, enchantment_level); + case "SWEEPING_EDGE" -> this.item.addUnsafeEnchantment(Enchantment.SWEEPING_EDGE, enchantment_level); + case "SILK_TOUCH" -> this.item.addUnsafeEnchantment(Enchantment.SILK_TOUCH, enchantment_level); + case "FORTUNE" -> this.item.addUnsafeEnchantment(Enchantment.FORTUNE, enchantment_level); + case "POWER" -> this.item.addUnsafeEnchantment(Enchantment.POWER, enchantment_level); + case "PUNCH" -> this.item.addUnsafeEnchantment(Enchantment.PUNCH, enchantment_level); + case "FLAME" -> this.item.addUnsafeEnchantment(Enchantment.FLAME, enchantment_level); + case "INFINITY" -> this.item.addUnsafeEnchantment(Enchantment.INFINITY, enchantment_level); + case "LUCK_OF_THE_SEA" -> this.item.addUnsafeEnchantment(Enchantment.LOOTING, enchantment_level); + case "LURE" -> this.item.addUnsafeEnchantment(Enchantment.LURE, enchantment_level); + case "LOYALTY" -> this.item.addUnsafeEnchantment(Enchantment.LOYALTY, enchantment_level); + case "IMPALING" -> this.item.addUnsafeEnchantment(Enchantment.IMPALING, enchantment_level); + case "RIPTIDE" -> this.item.addUnsafeEnchantment(Enchantment.RIPTIDE, enchantment_level); + case "CHANNELING" -> this.item.addUnsafeEnchantment(Enchantment.CHANNELING, enchantment_level); + case "MULTISHOT" -> this.item.addUnsafeEnchantment(Enchantment.MULTISHOT, enchantment_level); + case "QUICK_CHARGE" -> this.item.addUnsafeEnchantment(Enchantment.QUICK_CHARGE, enchantment_level); + case "PIERCING" -> this.item.addUnsafeEnchantment(Enchantment.PIERCING, enchantment_level); + case "DENSITY" -> this.item.addUnsafeEnchantment(Enchantment.DENSITY, enchantment_level); + case "WIND_BURST" -> this.item.addUnsafeEnchantment(Enchantment.WIND_BURST, enchantment_level); + case "MENDING" -> this.item.addUnsafeEnchantment(Enchantment.MENDING, enchantment_level); + case "VANISHING_CURSE" -> this.item.addUnsafeEnchantment(Enchantment.VANISHING_CURSE, enchantment_level); + case "SOUL_SPEED" -> this.item.addUnsafeEnchantment(Enchantment.SOUL_SPEED, enchantment_level); + case "SWIFT_SNEAK" -> this.item.addUnsafeEnchantment(Enchantment.SWIFT_SNEAK, enchantment_level); + default -> logger.warning("Enchantment " + enchantment_key + "does not exist."); + } + } + + // Save the metadata + item.setItemMeta(item_metadata); + + // Write the mythic id to the PDC + if (json.has("mythic_id")) { + setMythicId(json.getInt("mythic_id")); + } else { + logger.warning("No Mythic ID was included!"); } } @@ -45,7 +129,12 @@ public class MythicItem { if (mythic_jsons != null) { for (File mythic_json : mythic_jsons) { - String json_content = new Scanner(mythic_json).useDelimiter("\\Z").next(); + String json_content = null; + try { + json_content = new Scanner(mythic_json).useDelimiter("\\Z").next(); + } catch (FileNotFoundException e) { + throw new RuntimeException(e); + } mythic_items.add(new MythicItem(new JSONObject(json_content))); } @@ -54,6 +143,31 @@ public class MythicItem { return mythic_items; } + public static MythicItem getMythicById(int id) { + File mythic_directory = new File(MYTHIC_DIR); + File[] mythic_jsons = mythic_directory.listFiles(); + + if (mythic_jsons != null) { + for (File mythic_json : mythic_jsons) { + String json_content = null; + try { + json_content = new Scanner(mythic_json).useDelimiter("\\Z").next(); + } catch (FileNotFoundException e) { + throw new RuntimeException(e); + } + + JSONObject json = new JSONObject(json_content); + + if (json.has("mythic_id")) { + if (json.getInt("mythic_id") == id) { + return new MythicItem(json); + } + } + } + } + return new MythicItem(); + } + public static int getMythicId(ItemStack item) { PersistentDataContainer itemData = item.getItemMeta().getPersistentDataContainer(); diff --git a/src/main/java/net/hexa/MythicItems/Mythics/RockCracker.java b/src/main/java/net/hexa/MythicItems/Mythics/RockCracker.java deleted file mode 100644 index 55db657..0000000 --- a/src/main/java/net/hexa/MythicItems/Mythics/RockCracker.java +++ /dev/null @@ -1,27 +0,0 @@ -package net.hexa.MythicItems.Mythics; - -import org.bukkit.Material; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; - -import java.util.Arrays; - -public class RockCracker extends MythicItem { - public RockCracker() { - item = new ItemStack(Material.NETHERITE_PICKAXE); - - item.addUnsafeEnchantment(Enchantment.EFFICIENCY, 9); - item.addUnsafeEnchantment(Enchantment.UNBREAKING, 10); - - ItemMeta itemData = item.getItemMeta(); - - itemData.setUnbreakable(true); - itemData.setItemName("Rock Cracker"); - itemData.setLore(Arrays.asList("and the land thrashes in furious pain...")); - - item.setItemMeta(itemData); - - this.setMythicId(1); - } -} diff --git a/src/main/java/net/hexa/MythicItems/Mythics/Terra.java b/src/main/java/net/hexa/MythicItems/Mythics/Terra.java deleted file mode 100644 index eec524a..0000000 --- a/src/main/java/net/hexa/MythicItems/Mythics/Terra.java +++ /dev/null @@ -1,26 +0,0 @@ -package net.hexa.MythicItems.Mythics; - -import org.bukkit.Material; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; - -import java.util.Arrays; - -public class Terra extends MythicItem { - public Terra() { - item = new ItemStack(Material.NETHERITE_SHOVEL); - - item.addUnsafeEnchantment(Enchantment.EFFICIENCY, 8); - item.addUnsafeEnchantment(Enchantment.UNBREAKING, 10); - - ItemMeta meta = item.getItemMeta(); - - meta.setUnbreakable(true); - meta.setItemName("Terra"); - meta.setLore(Arrays.asList("All will eventually return to Terra.")); - - item.setItemMeta(meta); - setMythicId(2); - } -} diff --git a/src/main/resources/mythic-items/essence.json b/src/main/resources/mythic-items/essence.json new file mode 100644 index 0000000..7ad4d9b --- /dev/null +++ b/src/main/resources/mythic-items/essence.json @@ -0,0 +1,11 @@ +{ + "item_id" : "minecraft:clay_ball", + "Enchantments" : { + "FORTUNE" : 7 + }, + "Name" : "§4Mythic Essence", + "Lore" : [ + "§o§aMaybe this will give you something nice?" + ], + "mythic_id" : 0 +} \ No newline at end of file diff --git a/src/main/resources/mythic-items/terra-pickaxe.json b/src/main/resources/mythic-items/terra-pickaxe.json index 643cae7..b323fc8 100644 --- a/src/main/resources/mythic-items/terra-pickaxe.json +++ b/src/main/resources/mythic-items/terra-pickaxe.json @@ -5,7 +5,9 @@ "EFFICIENCY" : 9 }, "Name" : "Terra Pickaxe", - "Lore" : "and the land thrashes in furious pain...", + "Lore" : [ + "and the land thrashes in furious pain..." + ], "Unbreakable" : true, "mythic_id" : 1 } \ No newline at end of file diff --git a/src/main/resources/mythic-items/terra-shovel.json b/src/main/resources/mythic-items/terra-shovel.json new file mode 100644 index 0000000..f1e6e45 --- /dev/null +++ b/src/main/resources/mythic-items/terra-shovel.json @@ -0,0 +1,13 @@ +{ + "item_id" : "minecraft:netherite_shovel", + "Enchantments" : { + "UNBREAKING" : 10, + "EFFICIENCY" : 9 + }, + "Name" : "Terra Shovel", + "Lore" : [ + "All will eventually return to Terra." + ], + "Unbreakable" : true, + "mythic_id" : 2 +} \ No newline at end of file