From 275be9812e8423ded03d433bb13cb37ef4df37c9 Mon Sep 17 00:00:00 2001 From: basman93 Date: Mon, 1 Jan 2018 21:31:19 +0100 Subject: [PATCH] Added furnance crafting recipes --- pom.xml | 108 ++-- .../mc/customcrafting/CustomCrafting.java | 524 ++++++++++-------- src/main/resources/config.yml | 38 +- src/main/resources/plugin.yml | 52 +- 4 files changed, 406 insertions(+), 316 deletions(-) diff --git a/pom.xml b/pom.xml index fa26d5c..abf264d 100755 --- a/pom.xml +++ b/pom.xml @@ -1,55 +1,55 @@ - - 4.0.0 - org.forkzone.mc - CustomCrafting - jar - 0.0.2-ALPHA - CustomCrafting - - - ${basedir}/src/main/java - - - . - true - ${basedir}/src/main/resources/ - - plugin.yml - - - - . - false - ${basedir}/src/main/resources/ - - plugin.yml - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - - - - spigot-repo - https://hub.spigotmc.org/nexus/content/repositories/snapshots/ - - - - - org.bukkit - bukkit - 1.12.2-R0.1-SNAPSHOT - jar - provided - - + + 4.0.0 + org.forkzone.mc + CustomCrafting + jar + 0.0.3-ALPHA + CustomCrafting + + + ${basedir}/src/main/java + + + . + true + ${basedir}/src/main/resources/ + + plugin.yml + + + + . + false + ${basedir}/src/main/resources/ + + plugin.yml + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + + + + spigot-repo + https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + + + + org.bukkit + bukkit + 1.12.2-R0.1-SNAPSHOT + jar + provided + + \ No newline at end of file diff --git a/src/main/java/org/forkzone/mc/customcrafting/CustomCrafting.java b/src/main/java/org/forkzone/mc/customcrafting/CustomCrafting.java index 2cd0c01..11b40c2 100755 --- a/src/main/java/org/forkzone/mc/customcrafting/CustomCrafting.java +++ b/src/main/java/org/forkzone/mc/customcrafting/CustomCrafting.java @@ -1,223 +1,301 @@ -package org.forkzone.mc.customcrafting; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; - -import org.bukkit.Bukkit; -import org.bukkit.Material; -import org.bukkit.NamespacedKey; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.ShapedRecipe; -import org.bukkit.inventory.ShapelessRecipe; -import org.bukkit.plugin.java.JavaPlugin; - -public final class CustomCrafting extends JavaPlugin -{ - private static final String PREFIX = "[CustomCrafting] "; - //ArrayList recipeList = new ArrayList(); - - private String[][][] getShapeArray(String shape) - { - String[][][] shape_array = new String[3][3][2]; - String[] buffer = shape.split(";"); - - for(int i = 0; i < buffer.length; ++i) - { - String[] buffer_ = buffer[i].split(","); - for(int j = 0; j < buffer_.length; ++j) - { - String[] buffer__ = buffer_[j].split(":"); - - shape_array[i][j][0] = buffer__[0].toUpperCase(); - shape_array[i][j][1] = buffer__.length > 1 ? buffer__[1] : "0"; - } - } - - return shape_array; - } - - private String[][] getShapeArraySL(String shape) - { - ArrayList shape_array = new ArrayList(); - - String[] buffer = shape.split(","); - for(String buffer_ : buffer) - { - shape_array.add(getItemArray(buffer_)); - } - - return shape_array.toArray(new String[shape_array.size()][3]); - } - - private String[] getItemArray(String item) - { - String[] item_array = new String[3]; - String[] buffer_item = item.split("#"); - - String[] buffer_item_ = buffer_item[0].split(":"); - item_array[0] = buffer_item_[0].toUpperCase(); - item_array[1] = buffer_item_.length > 1 ? buffer_item_[1] : "0"; - item_array[2] = buffer_item.length > 1 ? buffer_item[1] : "1"; - - return item_array; - } - - private int toInt(String string) - { - return Integer.parseInt(string); - } - - private short toShort(String string) - { - return Short.parseShort(string); - } - - @SuppressWarnings("deprecation") - private void addNewRecipe(NamespacedKey name, String shape, String item, boolean shapeless) - { - String[] item_array = getItemArray(item); - if(Material.getMaterial(item_array[0]) == null) - { - getLogger().warning("Could not add \"" + name.getKey() + "\""); - getLogger().warning("Unknown: " + item_array[0]); - return; - } - else if(shapeless) - { - String[][] shape_array = getShapeArraySL(shape); - ShapelessRecipe recipe = new ShapelessRecipe(name, new ItemStack(Material.getMaterial(item_array[0]), toInt(item_array[2]), toShort(item_array[1]))); - - for(String[] ingredient_array : shape_array) - { - recipe.addIngredient(toInt(ingredient_array[2]), Material.getMaterial(ingredient_array[0]), toInt(ingredient_array[1])); - } - - if(!Bukkit.getServer().addRecipe(recipe)) - getLogger().warning("Something went wrong!"); - } - else - { - String[][][] shape_array = getShapeArray(shape); - - ShapedRecipe recipe = new ShapedRecipe(name, new ItemStack(Material.getMaterial(item_array[0]), toInt(item_array[2]), toShort(item_array[1]))); - - Map map = new HashMap(); - - int counter = 0; - - String[] recipe_shape = new String[3]; - - for(int i = 0; i < shape_array.length; ++i) - { - recipe_shape[i] = ""; - for(int j = 0; j < shape_array[i].length; ++j) - { - if(!map.containsKey(shape_array[i][j][0] + ":" + shape_array[i][j][1])) - { - if(shape_array[i][j][0].equalsIgnoreCase(" ") || shape_array[i][j][0].equalsIgnoreCase("0") || shape_array[i][j][0].equalsIgnoreCase("air")) - map.put(shape_array[i][j][0] + ":" + shape_array[i][j][1], ' '); - else - { - map.put(shape_array[i][j][0] + ":" + shape_array[i][j][1], (char)('a' + counter)); - ++counter; - } - } - recipe_shape[i] += map.get(shape_array[i][j][0] + ":" + shape_array[i][j][1]); - } - } - - recipe.shape(recipe_shape); - - for (Map.Entry entry : map.entrySet()) - { - if(!entry.getValue().equals(' ')) - { - String[] buffer = entry.getKey().split(":"); - recipe.setIngredient(entry.getValue(), Material.getMaterial(buffer[0]), toInt(buffer[1])); - } - } - - if(!Bukkit.getServer().addRecipe(recipe)) - getLogger().warning("Something went wrong!"); - } - getLogger().info("Add Recipe \"" + name.getKey() + "\""); - } - - private void readConfigAndAddRecipe() - { - for(String key : getConfig().getConfigurationSection("recipes").getKeys(false)) - { - NamespacedKey nkey = new NamespacedKey(this, key); - //recipeList.add(nkey); - addNewRecipe(nkey, getConfig().getString("recipes." + key + ".shape"), getConfig().getString("recipes." + key + ".item"), getConfig().getBoolean("recipes." + key + ".shapeless")); - } - } - - private void removeRecipe() - { - /* - Iterator iter = Bukkit.getServer().recipeIterator(); - while(iter.hasNext()) - { - Recipe r = iter.next(); - if(r != null && r instanceof ShapedRecipe) - { - if(recipeList.contains(((ShapedRecipe) r).getKey())) - iter.remove(); - } - else if(r != null && r instanceof ShapelessRecipe) - { - if(recipeList.contains(((ShapelessRecipe) r).getKey())) - iter.remove(); - } - } - recipeList.clear(); - */ - Bukkit.getServer().resetRecipes(); - } - - @Override - public void onEnable() - { - saveDefaultConfig(); - reloadConfig(); - readConfigAndAddRecipe(); - } - - @Override - public void onDisable() - { - removeRecipe(); - } - - @Override - public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) - { - if(cmd.getName().equalsIgnoreCase("customcrafting")) - { - if(args.length == 1 && args[0].equalsIgnoreCase("reload") && sender.hasPermission("customcrafting.reload")) - { - reloadConfig(); - removeRecipe(); - readConfigAndAddRecipe(); - sender.sendMessage(PREFIX + "reloaded!"); - } - else if(sender.hasPermission("customcrafting.infolite") || sender.hasPermission("customcrafting.info")) - { - sender.sendMessage(PREFIX + "Plugin Information"); - sender.sendMessage(PREFIX + "Name: " + getDescription().getName()); - sender.sendMessage(PREFIX + "Author: " + String.join(", ", getDescription().getAuthors())); - if(sender.hasPermission("customcrafting.info")) - { - sender.sendMessage(PREFIX + "Version: " + getDescription().getVersion()); - sender.sendMessage(PREFIX + "Arguments: reload"); - } - } - return true; - } - return false; - } -} +package org.forkzone.mc.customcrafting; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.inventory.FurnaceRecipe; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.ShapedRecipe; +import org.bukkit.inventory.ShapelessRecipe; +import org.bukkit.material.MaterialData; +import org.bukkit.plugin.java.JavaPlugin; + + +/** + * CustomCrafting Plugin for Bukkit by basma93 + * + *

Allows to add custom crafting recipes for the workbench or furnace + * + * @author basman93 + * @version 0.0.3 + * + */ +public final class CustomCrafting extends JavaPlugin +{ + /** Prefix {@value} for chat messages */ + private static final String PREFIX = "[CustomCrafting] "; + + /** Version number to check if the configfile is uptodate */ + private static final int CONFIG_VERSION = 1; + + /** + * @param shape (required) raw shape string + * @return returns the raw shape as an array:
+ * first level are the rows of the recipe,
+ * second level are the collums of the recipe,
+ * third level are the item ID's and Data values. + */ + private String[][][] getShapeArray(String shape) + { + String[][][] shape_array = new String[3][3][2]; + String[] buffer = shape.split(";"); + + for(int i = 0; i < buffer.length; ++i) + { + String[] buffer_ = buffer[i].split(","); + for(int j = 0; j < buffer_.length; ++j) + { + String[] buffer__ = buffer_[j].split(":"); + + shape_array[i][j][0] = buffer__[0].toUpperCase(); + shape_array[i][j][1] = buffer__.length > 1 ? buffer__[1] : "0"; + } + } + + return shape_array; + } + + /** + * @param shape (required) raw shape string + * @return returns the raw shape as an array:
+ * first level are the different items,
+ * second level are the different attribute of the item:
+ *

    + *
  1. Item ID
  2. + *
  3. Item data value
  4. + *
  5. Item amount
  6. + *
+ */ + private String[][] getShapeArraySL(String shape) + { + ArrayList shape_array = new ArrayList(); + + String[] buffer = shape.split(","); + for(String buffer_ : buffer) + { + shape_array.add(getItemArray(buffer_)); + } + + return shape_array.toArray(new String[shape_array.size()][3]); + } + + /** + * @param item (required) raw item string + * @return returns the raw shape as an array:
+ *
    + *
  1. Item ID
  2. + *
  3. Item data value
  4. + *
  5. Item amount
  6. + *
+ */ + private String[] getItemArray(String item) + { + String[] item_array = new String[3]; + String[] buffer_item = item.split("#"); + + String[] buffer_item_ = buffer_item[0].split(":"); + item_array[0] = buffer_item_[0].toUpperCase(); + item_array[1] = buffer_item_.length > 1 ? buffer_item_[1] : "0"; + item_array[2] = buffer_item.length > 1 ? buffer_item[1] : "1"; + + return item_array; + } + + /** parse a string to a int */ + private int toInt(String string) + { + return Integer.parseInt(string); + } + + /** parse a string to a short */ + private short toShort(String string) + { + return Short.parseShort(string); + } + + /** + * Adds a custom furnace recipe to bukkit + * @param name (required) the name of the recipe + * @param shape (required) the raw shape of the input item + * @param item (required) the raw shape of the output item + * @param xp (required) the xp the player will get for this + */ + @SuppressWarnings("deprecation") + private void addNewFurnaceRecipe(String name, String shape, String item, float xp) + { + String[] item_array = getItemArray(item); + if(Material.getMaterial(item_array[0]) == null) + { + getLogger().warning("Could not add \"" + name + "\""); + getLogger().warning("Unknown: " + item_array[0]); + return; + } + + String[] shape_array = getItemArray(shape); + if(Material.getMaterial(shape_array[0]) == null) + { + getLogger().warning("Could not add \"" + name + "\""); + getLogger().warning("Unknown: " + shape_array[0]); + return; + } + + FurnaceRecipe recipe = new FurnaceRecipe(new ItemStack(Material.getMaterial(item_array[0]), toInt(item_array[2]), toShort(item_array[1])), new MaterialData(Material.getMaterial(shape_array[0]), (byte) 0), xp); + if(!Bukkit.getServer().addRecipe(recipe)) + getLogger().warning("Something went wrong! Cannot add \"" + name + "\""); + else + getLogger().info("Add Furnace Recipe \"" + name + "\""); + } + + /** + * Adds a custom crafting recipe to bukkit + * @param name (required) the name of the recipe + * @param shape (required) the raw shape of the input item + * @param item (required) the raw shape of the output item + * @param shapeless (required) if the recipe is shapeless + */ + @SuppressWarnings("deprecation") + private void addNewRecipe(NamespacedKey name, String shape, String item, boolean shapeless) + { + String[] item_array = getItemArray(item); + if(Material.getMaterial(item_array[0]) == null) + { + getLogger().warning("Could not add \"" + name.getKey() + "\""); + getLogger().warning("Unknown: " + item_array[0]); + return; + } + else if(shapeless) + { + String[][] shape_array = getShapeArraySL(shape); + ShapelessRecipe recipe = new ShapelessRecipe(name, new ItemStack(Material.getMaterial(item_array[0]), toInt(item_array[2]), toShort(item_array[1]))); + + for(String[] ingredient_array : shape_array) + { + recipe.addIngredient(toInt(ingredient_array[2]), Material.getMaterial(ingredient_array[0]), toInt(ingredient_array[1])); + } + + if(!Bukkit.getServer().addRecipe(recipe)) + getLogger().warning("Something went wrong! Cannot add \"" + name.getKey() + "\""); + else + getLogger().info("Add Recipe \"" + name.getKey() + "\""); + } + else + { + String[][][] shape_array = getShapeArray(shape); + ShapedRecipe recipe = new ShapedRecipe(name, new ItemStack(Material.getMaterial(item_array[0]), toInt(item_array[2]), toShort(item_array[1]))); + Map map = new HashMap(); + int counter = 0; + String[] recipe_shape = new String[3]; + for(int i = 0; i < shape_array.length; ++i) + { + recipe_shape[i] = ""; + for(int j = 0; j < shape_array[i].length; ++j) + { + if(!map.containsKey(shape_array[i][j][0] + ":" + shape_array[i][j][1])) + { + if(shape_array[i][j][0].equalsIgnoreCase(" ") || shape_array[i][j][0].equalsIgnoreCase("0") || shape_array[i][j][0].equalsIgnoreCase("air")) + map.put(shape_array[i][j][0] + ":" + shape_array[i][j][1], ' '); + else + { + map.put(shape_array[i][j][0] + ":" + shape_array[i][j][1], (char)('a' + counter)); + ++counter; + } + } + recipe_shape[i] += map.get(shape_array[i][j][0] + ":" + shape_array[i][j][1]); + } + } + recipe.shape(recipe_shape); + for (Map.Entry entry : map.entrySet()) + { + if(!entry.getValue().equals(' ')) + { + String[] buffer = entry.getKey().split(":"); + recipe.setIngredient(entry.getValue(), Material.getMaterial(buffer[0]), toInt(buffer[1])); + } + } + if(!Bukkit.getServer().addRecipe(recipe)) + getLogger().warning("Something went wrong! Cannot add \"" + name.getKey() + "\""); + else + getLogger().info("Add Recipe \"" + name.getKey() + "\""); + } + } + + /** + * reads the configfile and adds every recipe found in it. + */ + private void readConfigAndAddRecipe() + { + for(String key : getConfig().getConfigurationSection("recipes").getKeys(false)) + { + NamespacedKey nkey = new NamespacedKey(this, key); + addNewRecipe(nkey, getConfig().getString("recipes." + key + ".shape"), getConfig().getString("recipes." + key + ".item"), getConfig().getBoolean("recipes." + key + ".shapeless")); + } + + for(String key : getConfig().getConfigurationSection("furnace_recipes").getKeys(false)) + { + addNewFurnaceRecipe(key, getConfig().getString("furnace_recipes." + key + ".shape"), getConfig().getString("furnace_recipes." + key + ".item"), (float) getConfig().getDouble("furnace_recipes." + key + ".xp")); + } + } + + /** + * removes the custom recipes from bukkit. + * At this moment its only possible to reset the recipes list to default. + */ + private void removeRecipe() + { + Bukkit.getServer().resetRecipes(); + } + + @Override + public void onEnable() + { + saveDefaultConfig(); + reloadConfig(); + + // Checks if the configfile is the required version, give out a warning otherwise. + if(getConfig().getInt("version", 0) < CONFIG_VERSION) + getLogger().warning("Please delete your configfile. Your configfile is outdated!"); + + readConfigAndAddRecipe(); + } + + @Override + public void onDisable() + { + removeRecipe(); + } + + @Override + public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) + { + if(cmd.getName().equalsIgnoreCase("customcrafting")) + { + if(args.length == 1 && args[0].equalsIgnoreCase("reload") && sender.hasPermission("customcrafting.reload")) + { + removeRecipe(); + saveDefaultConfig(); + reloadConfig(); + readConfigAndAddRecipe(); + sender.sendMessage(PREFIX + "reloaded!"); + } + else if(sender.hasPermission("customcrafting.infolite") || sender.hasPermission("customcrafting.info")) + { + sender.sendMessage(PREFIX + "Plugin Information"); + sender.sendMessage(PREFIX + "Name: " + getDescription().getName()); + sender.sendMessage(PREFIX + "Author: " + String.join(", ", getDescription().getAuthors())); + if(sender.hasPermission("customcrafting.info")) + { + sender.sendMessage(PREFIX + "Version: " + getDescription().getVersion()); + sender.sendMessage(PREFIX + "Arguments: reload"); + } + } + return true; + } + return false; + } +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index ab9372d..61102e0 100755 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,13 +1,25 @@ -recipes: - dirtyDiamond: - shapeless: false - shape: "dirt,dirt,dirt;dirt,coal,dirt;dirt,dirt,dirt" - item: "diamond:0#1" - quarzblocktoitem: - shapeless: true - shape: "quartz_block:-1#1" - item: "quartz:0#4" - notchapple: - shapeless: false - shape: "gold_block,gold_block,gold_block;gold_block,apple,gold_block;gold_block,gold_block,gold_block" - item: "golden_apple:1" \ No newline at end of file +#Do not edit the version number! +#INFO: xp by furnace_recipes don't work at this moment +version: 1 +recipes: + dirtyDiamond: + shapeless: false + shape: "dirt,dirt,dirt;dirt,coal,dirt;dirt,dirt,dirt" + item: "diamond:0#1" + quarzblocktoitem: + shapeless: true + shape: "quartz_block:-1#1" + item: "quartz:0#4" + notchapple: + shapeless: false + shape: "gold_block,gold_block,gold_block;gold_block,apple,gold_block;gold_block,gold_block,gold_block" + item: "golden_apple:1" +furnace_recipes: + diamond_recycle: + shape: "diamond_sword" + item: "diamond:0#1" + xp: 0 + breadfromwheat: + shape: "HAY_BLOCK" + item: "BREAD:0#3" + xp: 0 \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 8d8122b..fd9f439 100755 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,27 +1,27 @@ -name: CustomCrafting -main: org.forkzone.mc.customcrafting.CustomCrafting -version: "${project.version}" -description: Add possibility to add custom crafting receipts to the game. -author: basman93 -commands: - customcrafting: - description: Shows the plugin version or reloads it - usage: / [arguments] - permission: customcrafting.infolite - aliases: cc -permissions: - customcrafting.*: - description: Gives access to all CustomCrafting commands - children: - customcrafting.info: true - customcrafting.infolite: true - customcrafting.reload: true - customcrafting.info: - description: Allows to see the full information of this plugin - children: - customcrafting.infolite: true - customcrafting.infolite: - description: Allows to see the reduced information of this plugin - default: true - customcrafting.reload: +name: CustomCrafting +main: org.forkzone.mc.customcrafting.CustomCrafting +version: "${project.version}" +description: Add possibility to add custom crafting recipts to the game. +author: basman93 +commands: + customcrafting: + description: Shows the plugin version or reloads it + usage: / [arguments] + permission: customcrafting.infolite + aliases: cc +permissions: + customcrafting.*: + description: Gives access to all CustomCrafting commands + children: + customcrafting.info: true + customcrafting.infolite: true + customcrafting.reload: true + customcrafting.info: + description: Allows to see the full information of this plugin + children: + customcrafting.infolite: true + customcrafting.infolite: + description: Allows to see the reduced information of this plugin + default: true + customcrafting.reload: description: Allows to reload the plugin \ No newline at end of file