Initial commit. Implement basic features. Just requires tweaking.

master
sigonasr2 6 years ago
commit 75790cb620
  1. 4
      MCRandomizer/.gitignore
  2. 8
      MCRandomizer/plugin.yml
  3. 9
      MCRandomizer/readme.md
  4. 9
      MCRandomizer/src/scramble/plugin/RecipeStore.java
  5. 46
      MCRandomizer/src/scramble/plugin/ShapedRecipeStore.java
  6. 31
      MCRandomizer/src/scramble/plugin/ShapelessRecipeStore.java
  7. 282
      MCRandomizer/src/scramble/plugin/Template.java
  8. 54
      MCRandomizer/src/scramble/plugin/command/ExampleCommand.java
  9. 133
      MCRandomizer/src/scramble/plugin/listener/ExampleListener.java

@ -0,0 +1,4 @@
.classpath
.project
.settings
bin/

@ -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.

@ -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

@ -0,0 +1,9 @@
package scramble.plugin;
import org.bukkit.inventory.Recipe;
public interface RecipeStore {
public void setResultItem(String item);
public void createRecipe();
}

@ -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<Character,MaterialChoice> ingredientsMap = new HashMap<Character,MaterialChoice>();
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;
}
}

@ -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<String> craftingitems = new ArrayList<String>();
public String finalItem;
@Override
public void createRecipe() {
ShapelessRecipe sr = new ShapelessRecipe(new ItemStack(Material.getMaterial(finalItem)));
for (int i=0;i<craftingitems.size();i++) {
sr.addIngredient(Material.getMaterial(craftingitems.get(i)));
Bukkit.getLogger().info(" Added ingredient "+craftingitems.get(i));
}
Bukkit.getLogger().info("Added recipe for "+finalItem);
Bukkit.addRecipe(sr);
}
@Override
public void setResultItem(String item) {
this.finalItem=item;
}
}

@ -0,0 +1,282 @@
package scramble.plugin;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.logging.Logger;
import net.md_5.bungee.api.ChatColor;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.Server;
import org.bukkit.World;
import org.bukkit.command.PluginCommand;
import org.bukkit.inventory.BlastingRecipe;
import org.bukkit.inventory.CampfireRecipe;
import org.bukkit.inventory.FurnaceRecipe;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.MerchantRecipe;
import org.bukkit.inventory.Recipe;
import org.bukkit.inventory.RecipeChoice;
import org.bukkit.inventory.RecipeChoice.MaterialChoice;
import org.bukkit.inventory.ShapedRecipe;
import org.bukkit.inventory.ShapelessRecipe;
import org.bukkit.inventory.SmokingRecipe;
import org.bukkit.inventory.StonecuttingRecipe;
import org.bukkit.plugin.PluginDescriptionFile;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;
import scramble.plugin.command.ExampleCommand;
import scramble.plugin.listener.ExampleListener;
public class Template
extends JavaPlugin
{
public static final String CHAT_PREFIX = ChatColor.AQUA + "Scrambled Recipes";
private static Template plugin;
public static List<String> craftingrecipes;
public static List<String> smeltingrecipes;
public static List<RecipeStore> recipeStorage;
public static List<String> shufflelist;
public static List<ItemStack> 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<Material> 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<String> 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<Recipe> defaultRecipes = new ArrayList();
Iterator<Recipe> 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<String, Integer> 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);
}
}

@ -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;
}
}

@ -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<rec2.getIngredientList().size();i++) {
//ev.getViewers().get(0).sendMessage(rec2.getIngredientList().get(i).getData().toString());
sb.append(","+getCutItemStackData(rec2.getIngredientList().get(i)));
}
sb.append(","+getCutItemStackData(rec2.getResult()));
SaveData(ev, sb);
}
if (rec instanceof ShapedRecipe) {
ShapedRecipe rec2 = (ShapedRecipe)rec;
Map<Character,RecipeChoice> map1 = rec2.getChoiceMap();
Map<Character,ItemStack> 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();
}
}
}
Loading…
Cancel
Save