From 75790cb620487787969ec790a71d94cda7fc0bef Mon Sep 17 00:00:00 2001 From: sigonasr2 Date: Sun, 9 Jun 2019 14:44:59 +0900 Subject: [PATCH] Initial commit. Implement basic features. Just requires tweaking. --- MCRandomizer/.gitignore | 4 + MCRandomizer/plugin.yml | 8 + MCRandomizer/readme.md | 9 + .../src/scramble/plugin/RecipeStore.java | 9 + .../scramble/plugin/ShapedRecipeStore.java | 46 +++ .../scramble/plugin/ShapelessRecipeStore.java | 31 ++ .../src/scramble/plugin/Template.java | 282 ++++++++++++++++++ .../plugin/command/ExampleCommand.java | 54 ++++ .../plugin/listener/ExampleListener.java | 133 +++++++++ 9 files changed, 576 insertions(+) create mode 100644 MCRandomizer/.gitignore create mode 100644 MCRandomizer/plugin.yml create mode 100644 MCRandomizer/readme.md create mode 100644 MCRandomizer/src/scramble/plugin/RecipeStore.java create mode 100644 MCRandomizer/src/scramble/plugin/ShapedRecipeStore.java create mode 100644 MCRandomizer/src/scramble/plugin/ShapelessRecipeStore.java create mode 100644 MCRandomizer/src/scramble/plugin/Template.java create mode 100644 MCRandomizer/src/scramble/plugin/command/ExampleCommand.java create mode 100644 MCRandomizer/src/scramble/plugin/listener/ExampleListener.java diff --git a/MCRandomizer/.gitignore b/MCRandomizer/.gitignore new file mode 100644 index 0000000..fb110a9 --- /dev/null +++ b/MCRandomizer/.gitignore @@ -0,0 +1,4 @@ +.classpath +.project +.settings +bin/ \ No newline at end of file diff --git a/MCRandomizer/plugin.yml b/MCRandomizer/plugin.yml new file mode 100644 index 0000000..81210c6 --- /dev/null +++ b/MCRandomizer/plugin.yml @@ -0,0 +1,8 @@ +main: scramble.plugin.Template +name: MCRandomizer +author: sig +version: 1.0.0 +api-version: 1.13 +commands: + block: + description: Check a block's data. \ No newline at end of file diff --git a/MCRandomizer/readme.md b/MCRandomizer/readme.md new file mode 100644 index 0000000..3131b04 --- /dev/null +++ b/MCRandomizer/readme.md @@ -0,0 +1,9 @@ +# Creepinson's Spigot Plugin Template for Complete Beginners +**Thank you for using my plugin template! It is free to use in any of your plugins, just please credit me. That's all I request.** +*This template includes an example command, and an example event listener.* +*This template also includes a few utilities made both by me, and some other programmers out there.* +## Usage +I am also providing a link to get Spigot's buildtools here: +https://www.spigotmc.org/wiki/buildtools + + diff --git a/MCRandomizer/src/scramble/plugin/RecipeStore.java b/MCRandomizer/src/scramble/plugin/RecipeStore.java new file mode 100644 index 0000000..a75e4b0 --- /dev/null +++ b/MCRandomizer/src/scramble/plugin/RecipeStore.java @@ -0,0 +1,9 @@ +package scramble.plugin; + +import org.bukkit.inventory.Recipe; + +public interface RecipeStore { + public void setResultItem(String item); + public void createRecipe(); + +} diff --git a/MCRandomizer/src/scramble/plugin/ShapedRecipeStore.java b/MCRandomizer/src/scramble/plugin/ShapedRecipeStore.java new file mode 100644 index 0000000..84af9c3 --- /dev/null +++ b/MCRandomizer/src/scramble/plugin/ShapedRecipeStore.java @@ -0,0 +1,46 @@ +package scramble.plugin; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; + +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.RecipeChoice; +import org.bukkit.inventory.RecipeChoice.MaterialChoice; +import org.bukkit.inventory.ShapedRecipe; +import org.bukkit.inventory.ShapelessRecipe; + +public class ShapedRecipeStore implements RecipeStore{ + public String finalItem; + public String[] shape; + public HashMap ingredientsMap = new HashMap(); + + public ShapedRecipeStore(String[] shape) { + this.shape=shape; + } + + @Override + public void createRecipe() { + ShapedRecipe sr = new ShapedRecipe(new ItemStack(Material.getMaterial(finalItem))); + sr.shape(shape); + for (Character c : ingredientsMap.keySet()) { + MaterialChoice m = ingredientsMap.get(c); + if (m==null) { + sr.setIngredient(c, Material.AIR); + } else { + sr.setIngredient(c, m); + } + } + Bukkit.getLogger().info("Added recipe for "+finalItem); + Bukkit.addRecipe(sr); + } + + @Override + public void setResultItem(String item) { + this.finalItem=item; + } + +} diff --git a/MCRandomizer/src/scramble/plugin/ShapelessRecipeStore.java b/MCRandomizer/src/scramble/plugin/ShapelessRecipeStore.java new file mode 100644 index 0000000..133892d --- /dev/null +++ b/MCRandomizer/src/scramble/plugin/ShapelessRecipeStore.java @@ -0,0 +1,31 @@ +package scramble.plugin; + +import java.util.ArrayList; +import java.util.List; + +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.ShapelessRecipe; + +public class ShapelessRecipeStore implements RecipeStore{ + public List craftingitems = new ArrayList(); + public String finalItem; + + @Override + public void createRecipe() { + ShapelessRecipe sr = new ShapelessRecipe(new ItemStack(Material.getMaterial(finalItem))); + for (int i=0;i craftingrecipes; + + public static List smeltingrecipes; + + public static List recipeStorage; + public static List shufflelist; + public static List shufflelist2; + public static boolean enableRecipeModifications = false; + + PluginDescriptionFile pdfFile; + + public static Random r; + + public static Template getPlugin() + { + return plugin; + } + + public static void ReadRecipeData() { + if (!enableRecipeModifications) { + File f = new File("recipe_data"); + ReadIntoList(f, craftingrecipes); + File f2 = new File("furnace_data"); + ReadIntoList(f2, smeltingrecipes); + plugin.getLogger().info("Loaded " + craftingrecipes.size() + " crafting entries, " + smeltingrecipes.size() + " furnace entries."); + String shape; + for (String s : craftingrecipes) + { + String temp = s.substring(0, s.indexOf(",")); + s = s.substring(s.indexOf(",") + 1); + switch (temp) { + case "0": + { + String[] split = s.replace(" ", "").split(","); + ShapelessRecipeStore srs = new ShapelessRecipeStore(); + for (int i = 0; i < split.length - 1; i++) { + srs.craftingitems.add(split[i]); + } + recipeStorage.add(srs); + shufflelist.add(split[(split.length - 1)]); + }break; + case "1":{ + shape = s.substring(s.indexOf('[') + 1, s.indexOf(']')); + String[] shape_split = shape.replace(" ", "").split(","); + s = s.substring(s.indexOf(']') + 1); + String itemsList = s.substring(s.indexOf('[') + 1, s.lastIndexOf(']')); + + String[] itemsSplit = itemsList.replace(" ", "").split("\\]\\["); + + ShapedRecipeStore srs = new ShapedRecipeStore(shape_split); + for (String s2 : itemsSplit) { + String[] splitter = s2.split(","); + + + List splitter2 = new ArrayList(); + for (int i = 1; i < splitter.length; i++) { + Material m = Material.getMaterial(splitter[i]); + + if (m != null) { + splitter2.add(m); + } + else { + splitter2.add(Material.AIR); + } + } + + srs.ingredientsMap.put(Character.valueOf(splitter[0].charAt(0)), new RecipeChoice.MaterialChoice(splitter2)); + } + recipeStorage.add(srs); + s = s.substring(s.lastIndexOf(',') + 1); + shufflelist.add(s); + } + break; + } + } + plugin.getLogger().info("There are " + recipeStorage.size() + " recipes and " + shufflelist.size() + " shuffle items."); + if (recipeStorage.size() != shufflelist.size()) { + plugin.getLogger().severe("Recipe storage and Shuffle list sizes DO NOT MATCH. Exiting here..."); + Bukkit.shutdown(); + } + + plugin.getLogger().info("Creating recipes..."); + while (shufflelist.size() > 0) + { + Integer numb = Integer.valueOf(r.nextInt(recipeStorage.size())); + RecipeStore rs = (RecipeStore)recipeStorage.get(numb.intValue()); + rs.setResultItem((String)shufflelist.get(0)); + if ((rs instanceof ShapedRecipeStore)) { + ShapedRecipeStore rss = (ShapedRecipeStore)rs; + Bukkit.getLogger().info(Arrays.toString(rss.shape)); + for (Character c : rss.ingredientsMap.keySet()) { + Bukkit.getLogger().info(" " + c + ": " + rss.ingredientsMap.get(c)); + } + } + rs.createRecipe(); + shufflelist.remove(0); + recipeStorage.remove(rs); + } + plugin.getLogger().info("Done! All recipes shuffled!"); + } + } + + private static void ReadIntoList(File f, List list) + { + try { + FileReader fr = new FileReader(f); + BufferedReader br = new BufferedReader(fr); + String s = br.readLine(); + while (s != null) { + list.add(s); + s = br.readLine(); + } + br.close(); + fr.close(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void AddInDefaultRecipes() { + ShapedRecipe sr = new ShapedRecipe(new ItemStack(Material.CRAFTING_TABLE)); + sr.shape(new String[]{"aa","aa"}); + sr.setIngredient('a', new RecipeChoice.MaterialChoice(new Material[]{ + Material.ACACIA_PLANKS, + Material.BIRCH_PLANKS, + Material.DARK_OAK_PLANKS, + Material.JUNGLE_PLANKS, + Material.OAK_PLANKS, + Material.SPRUCE_PLANKS, + })); + Bukkit.addRecipe(sr); + } + + + public void onEnable() + { + craftingrecipes = new ArrayList(); + smeltingrecipes = new ArrayList(); + shufflelist = new ArrayList(); + shufflelist2 = new ArrayList(); + recipeStorage = new ArrayList(); + plugin = (Template)getPlugin(Template.class); + r = new Random(Bukkit.getWorld("world").getSeed()); + List defaultRecipes = new ArrayList(); + Iterator it = Bukkit.recipeIterator(); + while (it.hasNext()) { + Recipe r = (Recipe)it.next(); + defaultRecipes.add(r); + shufflelist2.add(r.getResult()); + Bukkit.getLogger().info("Found a recipe for " + r.getResult()); + } + Bukkit.clearRecipes(); + HashMap recipeTypeMap = new HashMap(); + + while (shufflelist2.size() > 0) { + Recipe rr = (Recipe)defaultRecipes.get(r.nextInt(defaultRecipes.size())); + boolean modified=true; + try { + if ((rr instanceof BlastingRecipe)) { + BlastingRecipe br = (BlastingRecipe)rr; + BlastingRecipe newbr = new BlastingRecipe(br.getKey(), (ItemStack)shufflelist2.get(0), br.getInputChoice(), br.getExperience(), br.getCookingTime()); + Bukkit.addRecipe(newbr); + } + else if ((rr instanceof CampfireRecipe)) { + CampfireRecipe br = (CampfireRecipe)rr; + CampfireRecipe newbr = new CampfireRecipe(br.getKey(), (ItemStack)shufflelist2.get(0), br.getInputChoice(), br.getExperience(), br.getCookingTime()); + Bukkit.addRecipe(newbr); + } + /*else if ((rr instanceof FurnaceRecipe)) { + FurnaceRecipe br = (FurnaceRecipe)rr; + FurnaceRecipe newbr = new FurnaceRecipe(br.getKey(), (ItemStack)shufflelist2.get(0), br.getInputChoice(), br.getExperience(), br.getCookingTime()); + Bukkit.addRecipe(newbr); + }*/ + else if ((rr instanceof MerchantRecipe)) { + MerchantRecipe br = (MerchantRecipe)rr; + MerchantRecipe newbr = new MerchantRecipe((ItemStack)shufflelist2.get(0), br.getUses(), br.getMaxUses(), true, br.getVillagerExperience(), br.getPriceMultiplier()); + Bukkit.addRecipe(newbr); + } + /*else if ((rr instanceof ShapedRecipe)) { + ShapedRecipe br = (ShapedRecipe)rr; + ShapedRecipe newbr = new ShapedRecipe((ItemStack)shufflelist2.get(0)); + newbr.shape(br.getShape()); + + for (Character c : br.getChoiceMap().keySet()) + { + newbr.setIngredient(c.charValue(), (RecipeChoice)br.getChoiceMap().get(c)); + } + Bukkit.addRecipe(newbr); + } + else if ((rr instanceof ShapelessRecipe)) { + ShapelessRecipe br = (ShapelessRecipe)rr; + ShapelessRecipe newbr = new ShapelessRecipe((ItemStack)shufflelist2.get(0)); + for (ItemStack i : br.getIngredientList()) { + newbr.addIngredient(i.getType()); + } + Bukkit.addRecipe(newbr); + }*/ + else if ((rr instanceof SmokingRecipe)) { + SmokingRecipe br = (SmokingRecipe)rr; + SmokingRecipe newbr = new SmokingRecipe(br.getKey(), (ItemStack)shufflelist2.get(0), br.getInputChoice(), br.getExperience(), br.getCookingTime()); + Bukkit.addRecipe(newbr); + } + else if ((rr instanceof StonecuttingRecipe)) { + StonecuttingRecipe br = (StonecuttingRecipe)rr; + StonecuttingRecipe newbr = new StonecuttingRecipe(br.getKey(), (ItemStack)shufflelist2.get(0), br.getInputChoice()); + Bukkit.addRecipe(newbr); + } else { + modified=false; + } + } + catch (IllegalStateException localIllegalStateException) {} + + if (modified) { + recipeTypeMap.put(rr.getClass().getName(), Integer.valueOf(recipeTypeMap.containsKey(rr.getClass().getName()) ? ((Integer)recipeTypeMap.get(rr.getClass().getName())).intValue() + 1 : 1)); + } + shufflelist2.remove(0); + } + ReadRecipeData(); + AddInDefaultRecipes(); + + for (String s : recipeTypeMap.keySet()) { + Bukkit.getLogger().info(" Randomized " + recipeTypeMap.get(s) + " " + s + " recipes."); + } + + PluginManager pm = getServer().getPluginManager(); + + getCommand("block").setExecutor(new ExampleCommand()); + + pm.registerEvents(new ExampleListener(), this); + } +} diff --git a/MCRandomizer/src/scramble/plugin/command/ExampleCommand.java b/MCRandomizer/src/scramble/plugin/command/ExampleCommand.java new file mode 100644 index 0000000..535e26c --- /dev/null +++ b/MCRandomizer/src/scramble/plugin/command/ExampleCommand.java @@ -0,0 +1,54 @@ +package scramble.plugin.command; + +import static scramble.plugin.Template.CHAT_PREFIX; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.BlockDataMeta; + +import net.md_5.bungee.api.ChatColor; +import scramble.plugin.Template; + +// All command classes need to implement the CommandExecutor interface to be a proper command! +public class ExampleCommand implements CommandExecutor { + + /* Called when the command is ran + args variable is the commands arguments in an array of strings. + sender variable is the sender who ran the command + */ + @Override + public boolean onCommand(CommandSender sender, Command cmd, String cmdLabel, String[] args) { + + /* Checks if the sender is sending from the console + CHAT_PREFIX is the variable from the Template plugin class and can be removed + if unwanted. + */ + if (!(sender instanceof Player)) { + sender.sendMessage(CHAT_PREFIX + ChatColor.WHITE + " > " + ChatColor.RED + "You cannot run this command from the console!"); + return false; + } + /* + * Since we made sure the sender is a player, we can create a new player + * variable using our sender + */ + Player p = (Player) sender; + + /* + * checks if First argument (/command FIRSTARGUMENT) is equal to the string In + * this case, the command would be: /example sayhi + */ + if (cmd.getName().equalsIgnoreCase("block")) { + if (p.getInventory().getItemInMainHand()!=null) { + ItemStack it = p.getInventory().getItemInMainHand(); + p.sendMessage(it.toString()); + } + return true; + } + return false; + } + +} diff --git a/MCRandomizer/src/scramble/plugin/listener/ExampleListener.java b/MCRandomizer/src/scramble/plugin/listener/ExampleListener.java new file mode 100644 index 0000000..ac57a22 --- /dev/null +++ b/MCRandomizer/src/scramble/plugin/listener/ExampleListener.java @@ -0,0 +1,133 @@ +package scramble.plugin.listener; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.util.Arrays; +import java.util.Map; + +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.inventory.CraftItemEvent; +import org.bukkit.event.inventory.FurnaceSmeltEvent; +import org.bukkit.event.inventory.PrepareItemCraftEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.Recipe; +import org.bukkit.inventory.RecipeChoice; +import org.bukkit.inventory.ShapedRecipe; +import org.bukkit.inventory.ShapelessRecipe; + +import net.md_5.bungee.api.ChatColor; +import scramble.plugin.Template; + +public class ExampleListener implements Listener { + + @EventHandler + public void onBlockBreak(BlockBreakEvent event) { + /* + * We get the player and make a variable to make it easier to access it when we + * need to use it. + */ + //Player p = event.getPlayer(); + /* + * Here we cancel the event. This means that they can't break the block. In this + * case, we send a message to the player saying they don't have the required + * permission. + */ + /*if (!p.hasPermission("template.breakblocks")) { + p.sendMessage(Template.CHAT_PREFIX + ChatColor.WHITE + " > " + ChatColor.RED + "You do not have permission to break blocks!"); + event.setCancelled(true); + }*/ + } + + @EventHandler + public void onCraftItemEvent(CraftItemEvent ev) { + /*for (in + //ev.getViewers().get(0).sendMessagt i=0;i<9;i++) { + //ev.getViewers().get(0).sendMessage(ev.getInventory().getItem(0).getData().toString()); + }*/ + //ev.getInventory().getSize() + + if (Template.enableRecipeModifications) { + Recipe rec = ev.getRecipe(); + if (rec instanceof ShapelessRecipe) { + StringBuilder sb = new StringBuilder("0"); + ShapelessRecipe rec2 = (ShapelessRecipe)rec; + for (int i=0;i map1 = rec2.getChoiceMap(); + Map map2 = rec2.getIngredientMap(); + StringBuilder sb = new StringBuilder("1"); + //ev.getViewers().get(0).sendMessage(Arrays.toString(rec2.getShape())); + sb.append(","+Arrays.toString(rec2.getShape())); + for (Character c : map1.keySet()) { + //ItemStack it = map2.get(c).; + sb.append("["+c+","+getCutChoices(map1.get(c))+"]"); + //ev.getViewers().get(0).sendMessage(c+","+map1.get(c)); + //ev.getViewers().get(0).sendMessage(rec2.getIngredientList().get(i).getData().toString()); + } + sb.append(","+getCutItemStackData(rec2.getResult())); + SaveData(ev, sb); + } + } + } + + @EventHandler + public void onSmeltItemEvent(FurnaceSmeltEvent ev) { + if (Template.enableRecipeModifications) { + Player p = Bukkit.getPlayer("sigonasr2"); + if (p!=null && p.isOnline()) { + StringBuilder sb = new StringBuilder(getCutItemStackData(ev.getSource())); + sb.append(","+getCutItemStackData(ev.getResult())); + Template.smeltingrecipes.add(sb.toString()); + p.sendMessage("Item["+Template.smeltingrecipes.size()+"] "+sb.toString()+" added."); + File f = new File("furnace_data"); + try{ + FileWriter fw = new FileWriter(f,true); + fw.write(sb.toString()+"\n"); + fw.close(); + } catch (IOException e) { + + } + } + } + } + + public String getCutItemStackData(ItemStack it) { + String s=it.toString().replace("ItemStack{", ""); + return s.substring(0,s.indexOf(' ')); + } + public String getCutChoices(RecipeChoice c) { + if (c!=null) { + String s = c.toString().replace("MaterialChoice{choices=[", ""); + return s.substring(0,s.indexOf(']')); + } else { + return "NULL"; + } + } + + private void SaveData(CraftItemEvent ev, StringBuilder sb) { + Template.craftingrecipes.add(sb.toString()); + ev.getViewers().get(0).sendMessage("Item["+Template.craftingrecipes.size()+"] " +sb.toString()+" added."); + + File f = new File("recipe_data"); + try { + FileWriter fw = new FileWriter(f,true); + fw.write(sb.toString()+"\n"); + fw.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } +}