diff --git a/pom.xml b/pom.xml
index 7fd8370..f0ef7a8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -31,6 +31,31 @@
${java.version}
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+ 3.5.0
+
+
+ package
+
+ shade
+
+
+ false
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+ 3.3.0
+
+ ${user.home}/Documents/vanilla+/plugins/
+
+
+
diff --git a/src/main/java/net/hexa/MythicItems/CommandListMythics.java b/src/main/java/net/hexa/MythicItems/CommandListMythics.java
index a60ab7a..3b7693b 100644
--- a/src/main/java/net/hexa/MythicItems/CommandListMythics.java
+++ b/src/main/java/net/hexa/MythicItems/CommandListMythics.java
@@ -7,6 +7,8 @@ import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
+import java.io.IOException;
+
public class CommandListMythics implements CommandExecutor {
@Override
@@ -14,7 +16,8 @@ public class CommandListMythics implements CommandExecutor {
if (sender instanceof Player) {
Player player = (Player) sender;
- ItemStack item = MythicItem.getMythicById(0).item;
+ ItemStack item = null;
+ item = MythicItem.getMythicById(0).item;
player.getInventory().addItem(item);
}
diff --git a/src/main/java/net/hexa/MythicItems/CommandMythicEssence.java b/src/main/java/net/hexa/MythicItems/CommandMythicEssence.java
index 6f7184c..73cf8c5 100644
--- a/src/main/java/net/hexa/MythicItems/CommandMythicEssence.java
+++ b/src/main/java/net/hexa/MythicItems/CommandMythicEssence.java
@@ -7,6 +7,8 @@ import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
+import java.io.IOException;
+
public class CommandMythicEssence implements CommandExecutor {
@Override
@@ -14,7 +16,8 @@ public class CommandMythicEssence implements CommandExecutor {
if (sender instanceof Player) {
Player player = (Player) sender;
- ItemStack item = MythicItem.getMythicById(0).item;
+ ItemStack item = null;
+ item = MythicItem.getMythicById(0).item;
player.getInventory().addItem(item);
}
diff --git a/src/main/java/net/hexa/MythicItems/MythicItems.java b/src/main/java/net/hexa/MythicItems/MythicItems.java
index d438142..f2b96d5 100644
--- a/src/main/java/net/hexa/MythicItems/MythicItems.java
+++ b/src/main/java/net/hexa/MythicItems/MythicItems.java
@@ -1,11 +1,21 @@
package net.hexa.MythicItems;
+
+import net.hexa.MythicItems.mythics.MythicItem;
+import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;
+import java.io.File;
+import java.util.List;
+
public class MythicItems extends JavaPlugin {
@Override
public void onEnable() {
getLogger().info("onEnable is called!");
+ MythicItem.init(this);
+
+ startupLog();
+
this.getCommand("essence").setExecutor(new CommandMythicEssence());
getServer().getPluginManager().registerEvents(new MythicListener(), this);
}
@@ -14,4 +24,24 @@ public class MythicItems extends JavaPlugin {
public void onDisable() {
getLogger().info("onDisable is called!");
}
+
+ // Helpers
+ private void startupLog() {
+ // Log which directory we are scanning for mythic JSON files
+ File mythicDir = new File(getDataFolder(), "mythic-items/");
+ getLogger().info("Scanning for mythics in: " + mythicDir.getPath());
+
+ List mythics = MythicItem.getMythics();
+ getLogger().info("Found " + mythics.size() + " mythic item(s).");
+
+ for (MythicItem mythic : mythics) {
+ ItemStack item = mythic.item;
+ String typeName = item.getType().name();
+ String displayName = item.getItemMeta() != null && item.getItemMeta().hasDisplayName()
+ ? item.getItemMeta().getDisplayName()
+ : "";
+ getLogger().info(" - Mythic: material=" + typeName + ", name=" + displayName);
+ }
+
+ }
}
\ No newline at end of file
diff --git a/src/main/java/net/hexa/MythicItems/mythics/MythicEssence.java b/src/main/java/net/hexa/MythicItems/mythics/MythicEssence.java
index 4098a3d..48d76f2 100644
--- a/src/main/java/net/hexa/MythicItems/mythics/MythicEssence.java
+++ b/src/main/java/net/hexa/MythicItems/mythics/MythicEssence.java
@@ -11,7 +11,7 @@ public class MythicEssence {
private static final List mythics = MythicItem.getMythics();
public static ItemStack rollMythic() {
- int mythic_id = random.nextInt(mythics.size() + 1);
+ int mythic_id = random.nextInt(mythics.size());
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 b621c93..8919f1f 100644
--- a/src/main/java/net/hexa/MythicItems/mythics/MythicItem.java
+++ b/src/main/java/net/hexa/MythicItems/mythics/MythicItem.java
@@ -1,6 +1,7 @@
package net.hexa.MythicItems.mythics;
-import org.json.*;
+import org.bukkit.plugin.java.JavaPlugin;
+import org.json.JSONObject;
import org.bukkit.Bukkit;
import org.bukkit.enchantments.Enchantment;
@@ -12,22 +13,31 @@ import org.bukkit.persistence.PersistentDataType;
import java.io.File;
import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
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";
+ private static final String MYTHIC_DIR = "mythic-items/";
+ private static JavaPlugin plugin;
public ItemStack item;
private static final Logger logger = Bukkit.getServer().getPluginManager().getPlugin("MythicItems").getLogger();
+ public static void init(JavaPlugin pl) {
+ plugin = pl;
+ }
+
public MythicItem() {}
// Parse a mythic item from a json file
public MythicItem(JSONObject json) {
+ logger.info("Json: " + json.toString());
if (json == null) {
item = new ItemStack(Material.GRAVEL);
logger.warning("Constructor was passed a NULL JSONObject.");
@@ -36,7 +46,12 @@ public class MythicItem {
String item_id = json.getString("item_id");
- this.item = new ItemStack(Material.getMaterial(item_id));
+ Material m = Material.matchMaterial(item_id);
+ if (m == null) {
+ m = Material.DIRT;
+ }
+
+ this.item = new ItemStack(m);
ItemMeta item_metadata = item.getItemMeta();
@@ -57,55 +72,57 @@ public class MythicItem {
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.");
+ // Add all enchantments onto the ItemMeta so they are not overwritten
+ if (json.has("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" -> item_metadata.addEnchant(Enchantment.UNBREAKING, enchantment_level, true);
+ case "EFFICIENCY" -> item_metadata.addEnchant(Enchantment.EFFICIENCY, enchantment_level, true);
+ case "PROTECTION" -> item_metadata.addEnchant(Enchantment.PROTECTION, enchantment_level, true);
+ case "FIRE_PROTECTION" -> item_metadata.addEnchant(Enchantment.FIRE_PROTECTION, enchantment_level, true);
+ case "FEATHER_FALLING" -> item_metadata.addEnchant(Enchantment.FEATHER_FALLING, enchantment_level, true);
+ case "BLAST_PROTECTION" -> item_metadata.addEnchant(Enchantment.BLAST_PROTECTION, enchantment_level, true);
+ case "PROJECTILE_PROTECTION" -> item_metadata.addEnchant(Enchantment.PROJECTILE_PROTECTION, enchantment_level, true);
+ case "RESPIRATION" -> item_metadata.addEnchant(Enchantment.RESPIRATION, enchantment_level, true);
+ case "AQUA_AFFINITY" -> item_metadata.addEnchant(Enchantment.AQUA_AFFINITY, enchantment_level, true);
+ case "THORNS" -> item_metadata.addEnchant(Enchantment.THORNS, enchantment_level, true);
+ case "DEPTH_STRIDER" -> item_metadata.addEnchant(Enchantment.DEPTH_STRIDER, enchantment_level, true);
+ case "FROST_WALKER" -> item_metadata.addEnchant(Enchantment.FROST_WALKER, enchantment_level, true);
+ case "BINDING_CURSE" -> item_metadata.addEnchant(Enchantment.BINDING_CURSE, enchantment_level, true); // if you want it for some reason
+ case "SHARPNESS" -> item_metadata.addEnchant(Enchantment.SHARPNESS, enchantment_level, true);
+ case "SMITE" -> item_metadata.addEnchant(Enchantment.SMITE, enchantment_level, true);
+ case "BANE_OF_ARTHROPODS" -> item_metadata.addEnchant(Enchantment.BANE_OF_ARTHROPODS, enchantment_level, true);
+ case "KNOCKBACK" -> item_metadata.addEnchant(Enchantment.KNOCKBACK, enchantment_level, true);
+ case "FIRE_ASPECT" -> item_metadata.addEnchant(Enchantment.FIRE_ASPECT, enchantment_level, true);
+ case "LOOTING" -> item_metadata.addEnchant(Enchantment.LOOTING, enchantment_level, true);
+ case "SWEEPING_EDGE" -> item_metadata.addEnchant(Enchantment.SWEEPING_EDGE, enchantment_level, true);
+ case "SILK_TOUCH" -> item_metadata.addEnchant(Enchantment.SILK_TOUCH, enchantment_level, true);
+ case "FORTUNE" -> item_metadata.addEnchant(Enchantment.FORTUNE, enchantment_level, true);
+ case "POWER" -> item_metadata.addEnchant(Enchantment.POWER, enchantment_level, true);
+ case "PUNCH" -> item_metadata.addEnchant(Enchantment.PUNCH, enchantment_level, true);
+ case "FLAME" -> item_metadata.addEnchant(Enchantment.FLAME, enchantment_level, true);
+ case "INFINITY" -> item_metadata.addEnchant(Enchantment.INFINITY, enchantment_level, true);
+ case "LUCK_OF_THE_SEA" -> item_metadata.addEnchant(Enchantment.LUCK_OF_THE_SEA, enchantment_level, true);
+ case "LURE" -> item_metadata.addEnchant(Enchantment.LURE, enchantment_level, true);
+ case "LOYALTY" -> item_metadata.addEnchant(Enchantment.LOYALTY, enchantment_level, true);
+ case "IMPALING" -> item_metadata.addEnchant(Enchantment.IMPALING, enchantment_level, true);
+ case "RIPTIDE" -> item_metadata.addEnchant(Enchantment.RIPTIDE, enchantment_level, true);
+ case "CHANNELING" -> item_metadata.addEnchant(Enchantment.CHANNELING, enchantment_level, true);
+ case "MULTISHOT" -> item_metadata.addEnchant(Enchantment.MULTISHOT, enchantment_level, true);
+ case "QUICK_CHARGE" -> item_metadata.addEnchant(Enchantment.QUICK_CHARGE, enchantment_level, true);
+ case "PIERCING" -> item_metadata.addEnchant(Enchantment.PIERCING, enchantment_level, true);
+ case "DENSITY" -> item_metadata.addEnchant(Enchantment.DENSITY, enchantment_level, true);
+ case "WIND_BURST" -> item_metadata.addEnchant(Enchantment.WIND_BURST, enchantment_level, true);
+ case "MENDING" -> item_metadata.addEnchant(Enchantment.MENDING, enchantment_level, true);
+ case "VANISHING_CURSE" -> item_metadata.addEnchant(Enchantment.VANISHING_CURSE, enchantment_level, true);
+ case "SOUL_SPEED" -> item_metadata.addEnchant(Enchantment.SOUL_SPEED, enchantment_level, true);
+ case "SWIFT_SNEAK" -> item_metadata.addEnchant(Enchantment.SWIFT_SNEAK, enchantment_level, true);
+ default -> logger.warning("Enchantment " + enchantment_key + " does not exist.");
+ }
}
}
@@ -120,51 +137,74 @@ public class MythicItem {
}
}
- // Parse all mythic items in the resources/mythics-items/ directory
+ // Parse all mythic items from the plugin's data folder mythic-items/ directory
public static List getMythics() {
- ArrayList mythic_items = new ArrayList<>();
+ ArrayList mythicItems = new ArrayList<>();
- 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);
- }
-
- mythic_items.add(new MythicItem(new JSONObject(json_content)));
- }
+ if (plugin == null) {
+ logger.warning("MythicItem plugin reference is null; cannot load mythics.");
+ return mythicItems;
}
- return mythic_items;
+ File mythicDirectory = new File(plugin.getDataFolder(), MYTHIC_DIR);
+ if (!mythicDirectory.exists() || !mythicDirectory.isDirectory()) {
+ logger.warning("Mythic directory does not exist: " + mythicDirectory.getPath());
+ return mythicItems;
+ }
+
+ File[] mythicJsons = mythicDirectory.listFiles((dir, name) -> name.toLowerCase().endsWith(".json"));
+ if (mythicJsons == null) {
+ return mythicItems;
+ }
+
+ for (File mythicJson : mythicJsons) {
+ String jsonContent;
+ try {
+ jsonContent = new Scanner(mythicJson).useDelimiter("\\Z").next();
+ } catch (FileNotFoundException e) {
+ logger.warning("Failed to read mythic file " + mythicJson.getName() + ": " + e.getMessage());
+ continue;
+ }
+
+ mythicItems.add(new MythicItem(new JSONObject(jsonContent)));
+ }
+
+ return mythicItems;
}
public static MythicItem getMythicById(int id) {
- File mythic_directory = new File(MYTHIC_DIR);
- File[] mythic_jsons = mythic_directory.listFiles();
+ if (plugin == null) {
+ logger.warning("MythicItem plugin reference is null; cannot load mythics by id.");
+ return new MythicItem();
+ }
- 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);
- }
+ File mythicDirectory = new File(plugin.getDataFolder(), MYTHIC_DIR);
+ if (!mythicDirectory.exists() || !mythicDirectory.isDirectory()) {
+ logger.warning("Mythic directory does not exist: " + mythicDirectory.getPath());
+ return new MythicItem();
+ }
- JSONObject json = new JSONObject(json_content);
+ File[] mythicJsons = mythicDirectory.listFiles((dir, name) -> name.toLowerCase().endsWith(".json"));
+ if (mythicJsons == null) {
+ return new MythicItem();
+ }
- if (json.has("mythic_id")) {
- if (json.getInt("mythic_id") == id) {
- return new MythicItem(json);
- }
- }
+ for (File mythicJson : mythicJsons) {
+ String jsonContent;
+ try {
+ jsonContent = new Scanner(mythicJson).useDelimiter("\\Z").next();
+ } catch (FileNotFoundException e) {
+ logger.warning("Failed to read mythic file " + mythicJson.getName() + ": " + e.getMessage());
+ continue;
+ }
+
+ JSONObject json = new JSONObject(jsonContent);
+ if (json.has("mythic_id") && json.getInt("mythic_id") == id) {
+ return new MythicItem(json);
}
}
+
+ logger.warning("No mythic found with id " + id + "; returning default MythicItem.");
return new MythicItem();
}